<!DOCTYPE html>
<html lang="en" dir="ltr" typeof="bibo:Document w3p:CR" about="" property="dcterms:language" content="en">
<head>
<title>JSON-LD 1.0 Processing Algorithms and API</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<style type="text/css">
  .diff {
    font-weight:bold; color:#0a3;
  }
  .error a {
    color:  #ff4500;
    border-bottom:  1px dotted #ff4500;
    text-decoration: none;
  }
  .atrisk-head {
    font-style: italic;
  }
  ol.algorithm {
    counter-reset: numsection;
    list-style-type: none;
  }
  ol.algorithm li {
    margin: 0.5em 0;
  }
  ol.algorithm li:before {
    font-weight: bold;
    counter-increment: numsection;
    content: counters(numsection, ".") ") ";
  }
</style>
<style>
/* --- INLINES --- */
em.rfc2119 {
    text-transform:     lowercase;
    font-variant:       small-caps;
    font-style:         normal;
    color:              #900;
}

h1 acronym, h2 acronym, h3 acronym, h4 acronym, h5 acronym, h6 acronym, a acronym,
h1 abbr, h2 abbr, h3 abbr, h4 abbr, h5 abbr, h6 abbr, a abbr {
    border: none;
}

dfn {
    font-weight:    bold;
}

a.internalDFN {
    color:  inherit;
    border-bottom:  1px solid #99c;
    text-decoration:    none;
}

a.externalDFN {
    color:  inherit;
    border-bottom:  1px dotted #ccc;
    text-decoration:    none;
}

a.bibref {
    text-decoration:    none;
}

cite .bibref {
    font-style: normal;
}

code {
    color:  #ff4500;
}

/* --- TOC --- */
.toc a, .tof a {
    text-decoration:    none;
}

a .secno, a .figno {
    color:  #000;
}

ul.tof, ol.tof {
    list-style: none outside none;
}

.caption {
    margin-top: 0.5em;
    font-style:   italic;
}

/* --- TABLE --- */
table.simple {
    border-spacing: 0;
    border-collapse:    collapse;
    border-bottom:  3px solid #005a9c;
}

.simple th {
    background: #005a9c;
    color:  #fff;
    padding:    3px 5px;
    text-align: left;
}

.simple th[scope="row"] {
    background: inherit;
    color:  inherit;
    border-top: 1px solid #ddd;
}

.simple td {
    padding:    3px 10px;
    border-top: 1px solid #ddd;
}

.simple tr:nth-child(even) {
    background: #f0f6ff;
}

/* --- DL --- */
.section dd > p:first-child {
    margin-top: 0;
}

.section dd > p:last-child {
    margin-bottom: 0;
}

.section dd {
    margin-bottom:  1em;
}

.section dl.attrs dd, .section dl.eldef dd {
    margin-bottom:  0;
}
</style><style>/* --- EXAMPLES --- */
div.example-title {
    min-width: 7.5em;
    color: #b9ab2d;
}
div.example-title span {
    text-transform: uppercase;
}
aside.example, div.example, div.illegal-example {
    padding: 0.5em;
    margin: 1em 0;
    position: relative;
    clear: both;
}
div.illegal-example { color: red }
div.illegal-example p { color: black }
aside.example, div.example {
    padding: .5em;
    border-left-width: .5em;
    border-left-style: solid;
    border-color: #e0cb52;
    background: #fcfaee;
}

aside.example div.example {
    border-left-width: .1em;
    border-color: #999;
    background: #fff;
}
aside.example div.example div.example-title {
    color: #999;
}
</style><style>/* --- ISSUES/NOTES --- */
div.issue-title, div.note-title {
    padding-right:  1em;
    min-width: 7.5em;
    color: #b9ab2d;
}
div.issue-title { color: #e05252; }
div.note-title { color: #2b2; }
div.issue-title span, div.note-title span {
    text-transform: uppercase;
}
div.note, div.issue {
    margin-top: 1em;
    margin-bottom: 1em;
}
.note > p:first-child, .issue > p:first-child { margin-top: 0 }
.issue, .note {
    padding: .5em;
    border-left-width: .5em;
    border-left-style: solid;
}
div.issue, div.note {
    padding: 1em 1.2em 0.5em;
    margin: 1em 0;
    position: relative;
    clear: both;
}
span.note, span.issue { padding: .1em .5em .15em; }

.issue {
    border-color: #e05252;
    background: #fbe9e9;
}
.note {
    border-color: #52e052;
    background: #e9fbe9;
}


</style><style>/* --- WEB IDL --- */
pre.idl {
    border-top: 1px solid #90b8de;
    border-bottom: 1px solid #90b8de;
    padding:    1em;
    line-height:    120%;
}

pre.idl::before {
    content:    "WebIDL";
    display:    block;
    width:      150px;
    background: #90b8de;
    color:  #fff;
    font-family:    initial;
    padding:    3px;
    font-weight:    bold;
    margin: -1em 0 1em -1em;
}

.idlType {
    color:  #ff4500;
    font-weight:    bold;
    text-decoration:    none;
}

/*.idlModule*/
/*.idlModuleID*/
/*.idlInterface*/
.idlInterfaceID, .idlDictionaryID, .idlCallbackID, .idlEnumID {
    font-weight:    bold;
    color:  #005a9c;
}
a.idlEnumItem {
    color:  #000;
    border-bottom:  1px dotted #ccc;
    text-decoration: none;
}

.idlSuperclass {
    font-style: italic;
    color:  #005a9c;
}

/*.idlAttribute*/
.idlAttrType, .idlFieldType, .idlMemberType {
    color:  #005a9c;
}
.idlAttrName, .idlFieldName, .idlMemberName {
    color:  #ff4500;
}
.idlAttrName a, .idlFieldName a, .idlMemberName a {
    color:  #ff4500;
    border-bottom:  1px dotted #ff4500;
    text-decoration: none;
}

/*.idlMethod*/
.idlMethType, .idlCallbackType {
    color:  #005a9c;
}
.idlMethName {
    color:  #ff4500;
}
.idlMethName a {
    color:  #ff4500;
    border-bottom:  1px dotted #ff4500;
    text-decoration: none;
}

/*.idlCtor*/
.idlCtorName {
    color:  #ff4500;
}
.idlCtorName a {
    color:  #ff4500;
    border-bottom:  1px dotted #ff4500;
    text-decoration: none;
}

/*.idlParam*/
.idlParamType {
    color:  #005a9c;
}
.idlParamName, .idlDefaultValue {
    font-style: italic;
}

.extAttr {
    color:  #666;
}

/*.idlSectionComment*/
.idlSectionComment {
    color: gray;
}

/*.idlConst*/
.idlConstType {
    color:  #005a9c;
}
.idlConstName {
    color:  #ff4500;
}
.idlConstName a {
    color:  #ff4500;
    border-bottom:  1px dotted #ff4500;
    text-decoration: none;
}

/*.idlException*/
.idlExceptionID {
    font-weight:    bold;
    color:  #c00;
}

.idlTypedefID, .idlTypedefType {
    color:  #005a9c;
}

.idlRaises, .idlRaises a.idlType, .idlRaises a.idlType code, .excName a, .excName a code {
    color:  #c00;
    font-weight:    normal;
}

.excName a {
    font-family:    monospace;
}

.idlRaises a.idlType, .excName a.idlType {
    border-bottom:  1px dotted #c00;
}

.excGetSetTrue, .excGetSetFalse, .prmNullTrue, .prmNullFalse, .prmOptTrue, .prmOptFalse {
    width:  45px;
    text-align: center;
}
.excGetSetTrue, .prmNullTrue, .prmOptTrue { color:  #0c0; }
.excGetSetFalse, .prmNullFalse, .prmOptFalse { color:  #c00; }

.idlImplements a {
    font-weight:    bold;
}

dl.attributes, dl.methods, dl.constants, dl.constructors, dl.fields, dl.dictionary-members {
    margin-left:    2em;
}

.attributes dt, .methods dt, .constants dt, .constructors dt, .fields dt, .dictionary-members dt {
    font-weight:    normal;
}

.attributes dt code, .methods dt code, .constants dt code, .constructors dt code, .fields dt code, .dictionary-members dt code {
    font-weight:    bold;
    color:  #000;
    font-family:    monospace;
}

.attributes dt code, .fields dt code, .dictionary-members dt code {
    background:  #ffffd2;
}

.attributes dt .idlAttrType code, .fields dt .idlFieldType code, .dictionary-members dt .idlMemberType code {
    color:  #005a9c;
    background:  transparent;
    font-family:    inherit;
    font-weight:    normal;
    font-style: italic;
}

.methods dt code {
    background:  #d9e6f8;
}

.constants dt code {
    background:  #ddffd2;
}

.constructors dt code {
    background:  #cfc;
}

.attributes dd, .methods dd, .constants dd, .constructors dd, .fields dd, .dictionary-members dd {
    margin-bottom:  1em;
}

table.parameters, table.exceptions {
    border-spacing: 0;
    border-collapse:    collapse;
    margin: 0.5em 0;
    width:  100%;
}
table.parameters { border-bottom:  1px solid #90b8de; }
table.exceptions { border-bottom:  1px solid #deb890; }

.parameters th, .exceptions th {
    color:  #fff;
    padding:    3px 5px;
    text-align: left;
    font-family:    initial;
    font-weight:    normal;
    text-shadow:    #666 1px 1px 0;
}
.parameters th { background: #90b8de; }
.exceptions th { background: #deb890; }

.parameters td, .exceptions td {
    padding:    3px 10px;
    border-top: 1px solid #ddd;
    vertical-align: top;
}

.parameters tr:first-child td, .exceptions tr:first-child td {
    border-top: none;
}

.parameters td.prmName, .exceptions td.excName, .exceptions td.excCodeName {
    width:  100px;
}

.parameters td.prmType {
    width:  120px;
}

table.exceptions table {
    border-spacing: 0;
    border-collapse:    collapse;
    width:  100%;
}
</style><link rel="stylesheet" href="https://www.w3.org/StyleSheets/TR/W3C-CR"><!--[if lt IE 9]><script src='https://www.w3.org/2008/site/js/html5shiv.js'></script><![endif]--></head>

<body class="h-entry" role="document" id="respecDocument"><div class="head" role="contentinfo" id="respecHeader">
  <p>

      <a href="http://www.w3.org/"><img width="72" height="48" src="https://www.w3.org/Icons/w3c_home" alt="W3C"></a>

  </p>
  <h1 class="title p-name" id="title" property="dcterms:title">JSON-LD 1.0 Processing Algorithms and API</h1>

  <h2 property="dcterms:issued" datatype="xsd:dateTime" content="2013-09-09T22:00:00.000Z" id="w3c-candidate-recommendation-10-september-2013"><abbr title="World Wide Web Consortium">W3C</abbr> Candidate Recommendation <time class="dt-published" datetime="2013-09-10">10 September 2013</time></h2>
  <dl>

      <dt>This version:</dt>
      <dd><a class="u-url" href="http://www.w3.org/TR/2013/CR-json-ld-api-20130910/">http://www.w3.org/TR/2013/CR-json-ld-api-20130910/</a></dd>
      <dt>Latest published version:</dt>
      <dd><a href="http://www.w3.org/TR/json-ld-api/">http://www.w3.org/TR/json-ld-api/</a></dd>


      <dt>Latest editor's draft:</dt>
      <dd><a href="http://dvcs.w3.org/hg/json-ld/raw-file/default/spec/latest/json-ld-api/index.html">http://dvcs.w3.org/hg/json-ld/raw-file/default/spec/latest/json-ld-api/index.html</a></dd>


      <dt>Test suite:</dt>
      <dd><a href="http://www.w3.org/2013/json-ld-tests/">http://www.w3.org/2013/json-ld-tests/</a></dd>




      <dt>Previous version:</dt>
      <dd><a rel="dcterms:replaces" href="http://www.w3.org/TR/2013/WD-json-ld-api-20130516/">http://www.w3.org/TR/2013/WD-json-ld-api-20130516/</a></dd>


    <dt>Editors:</dt>
    <dd class="p-author h-card vcard" rel="bibo:editor" inlist=""><span typeof="foaf:Person"><a class="u-url url p-name fn" rel="foaf:homepage" property="foaf:name" content="Markus Lanthaler" href="http://www.markus-lanthaler.com/">Markus Lanthaler</a>, <a rel="foaf:workplaceHomepage" class="p-org org h-org h-card" href="http://www.tugraz.at/">Graz University of Technology</a></span>
</dd>
<dd class="p-author h-card vcard" rel="bibo:editor" inlist=""><span typeof="foaf:Person"><a class="u-url url p-name fn" rel="foaf:homepage" property="foaf:name" content="Gregg Kellogg" href="http://greggkellogg.net/">Gregg Kellogg</a>, <a rel="foaf:workplaceHomepage" class="p-org org h-org h-card" href="http://kellogg-assoc.com/">Kellogg Associates</a></span>
</dd>
<dd class="p-author h-card vcard" rel="bibo:editor" inlist=""><span typeof="foaf:Person"><a class="u-url url p-name fn" rel="foaf:homepage" property="foaf:name" content="Manu Sporny" href="http://manu.sporny.org/">Manu Sporny</a>, <a rel="foaf:workplaceHomepage" class="p-org org h-org h-card" href="http://digitalbazaar.com/">Digital Bazaar</a></span>
</dd>


      <dt>Authors:</dt>
      <dd class="p-author h-card vcard" rel="dcterms:contributor"><span typeof="foaf:Person"><a class="u-url url p-name fn" rel="foaf:homepage" property="foaf:name" content="Dave Longley" href="http://digitalbazaar.com/">Dave Longley</a>, <a rel="foaf:workplaceHomepage" class="p-org org h-org h-card" href="http://digitalbazaar.com/">Digital Bazaar</a></span>
</dd>
<dd class="p-author h-card vcard" rel="dcterms:contributor"><span typeof="foaf:Person"><a class="u-url url p-name fn" rel="foaf:homepage" property="foaf:name" content="Gregg Kellogg" href="http://greggkellogg.net/">Gregg Kellogg</a>, <a rel="foaf:workplaceHomepage" class="p-org org h-org h-card" href="http://kellogg-assoc.com/">Kellogg Associates</a></span>
</dd>
<dd class="p-author h-card vcard" rel="dcterms:contributor"><span typeof="foaf:Person"><a class="u-url url p-name fn" rel="foaf:homepage" property="foaf:name" content="Markus Lanthaler" href="http://www.markus-lanthaler.com/">Markus Lanthaler</a>, <a rel="foaf:workplaceHomepage" class="p-org org h-org h-card" href="http://www.tugraz.at/">Graz University of Technology</a></span>
</dd>
<dd class="p-author h-card vcard" rel="dcterms:contributor"><span typeof="foaf:Person"><a class="u-url url p-name fn" rel="foaf:homepage" property="foaf:name" content="Manu Sporny" href="http://digitalbazaar.com/">Manu Sporny</a>, <a rel="foaf:workplaceHomepage" class="p-org org h-org h-card" href="http://digitalbazaar.com/">Digital Bazaar</a></span>
</dd>



  </dl>


    <p>

        This document is also available in this non-normative format:

      <a rel="alternate" href="diff-20130516.html">diff to previous version</a>
    </p>




      <p class="copyright">
        <a href="http://www.w3.org/Consortium/Legal/ipr-notice#Copyright">Copyright</a> ©
        2010-2013

        <a href="http://www.w3.org/"><abbr title="World Wide Web Consortium">W3C</abbr></a><sup>®</sup>
        (<a href="http://www.csail.mit.edu/"><abbr title="Massachusetts Institute of Technology">MIT</abbr></a>,
        <a href="http://www.ercim.eu/"><abbr title="European Research Consortium for Informatics and Mathematics">ERCIM</abbr></a>,
        <a href="http://www.keio.ac.jp/">Keio</a>, <a href="http://ev.buaa.edu.cn/">Beihang</a>), All Rights Reserved.
        <abbr title="World Wide Web Consortium">W3C</abbr> <a href="http://www.w3.org/Consortium/Legal/ipr-notice#Legal_Disclaimer">liability</a>,
        <a href="http://www.w3.org/Consortium/Legal/ipr-notice#W3C_Trademarks">trademark</a> and
        <a href="http://www.w3.org/Consortium/Legal/copyright-documents">document use</a> rules apply.
      </p>


  <hr>
</div>
<section id="abstract" class="introductory" property="dcterms:abstract" datatype="" typeof="bibo:Chapter" resource="#abstract" rel="bibo:chapter"><h2 aria-level="1" role="heading" id="h2_abstract">Abstract</h2>
  <p>This specification defines an Application Programming Interface (API)
    and a set of algorithms for programmatic transformations of JSON-LD
    documents. Restructuring data according to the defined transformations
    often dramatically simplifies its usage.</p>
</section><section id="sotd" class="introductory" typeof="bibo:Chapter" resource="#sotd" rel="bibo:chapter"><h2 aria-level="1" role="heading" id="h2_sotd">Status of This Document</h2>



        <p>
          <em>This section describes the status of this document at the time of its publication. Other
          documents may supersede this document. A list of current <abbr title="World Wide Web Consortium">W3C</abbr> publications and the latest revision
          of this technical report can be found in the <a href="http://www.w3.org/TR/"><abbr title="World Wide Web Consortium">W3C</abbr> technical reports
          index</a> at http://www.w3.org/TR/.</em>
        </p>

  <p>This document has been under development for over 30 months in the
    JSON for Linking Data Community Group. The document has been
    transferred to the RDF Working Group for review, improvement, and publication
    along the Recommendation track. The specification has undergone significant
    development, review, and changes during the course of the last 30 months.</p>

  <p>There are several independent
    <a href="http://json-ld.org/test-suite/reports/">interoperable implementations</a> of
    this specification. There is a fairly complete test suite [<cite><a class="bibref" href="#bib-JSON-LD-TESTS">JSON-LD-TESTS</a></cite>]
    and a <a href="http://json-ld.org/playground/">live JSON-LD editor</a>
    that is capable of demonstrating the features described in
    this document. While there will be continuous development on implementations,
    the test suite, and the live editor, they are believed to be mature enough
    to be integrated into a non-production system at this point in time. There
    is an expectation that they could be used in a production system within the
    next three months.</p>

  <p>The following features are at risk and may be removed:</p>

  <ul>
    <li><a href="#at-risk-10">Support for <code>@base: null</code></a></li>
    <li><a href="#at-risk-3">Allow blank nodes to be used as properties</a></li>
    <li><a href="#at-risk-8">Properly referencing the DOM Promises spec</a></li>
    <li><a href="#at-risk-4">Lists of lists and partial list conversion from RDF</a></li>
  </ul>

  <p>Changes since the
    <a href="http://www.w3.org/TR/2013/WD-json-ld-api-20130411/">11&nbsp;April&nbsp;2013 Last Call Working Draft</a>:</p>

  <ul>
    <li>Use of DOM Futures instead of callbacks in the Application Programming Interface</li>
    <li>Processing of terms that are redefined to themselves without raising an
      <code class="error"><a href="#idl-def-JsonLdErrorCode.cyclic-IRI-mapping">cyclic <abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a></code> error</li>
    <li>Raise an <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-IRI-mapping">invalid <abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a></code>
      error if relative URLs are used in term definitions</li>
    <li>Support relative IRIs in <code>@base</code></li>
    <li>Remove default value of <code class="idlMemberName"><a href="#idl-def-JsonLdOptions">JsonLdOption's</a></code>
      <code class="idlMemberName"><a href="#widl-JsonLdOptions-base">base</a></code> member</li>
    <li>Support lists of lists when serializing RDF as JSON-LD</li>
    <li>Support for relative URLs in <code>@base</code> and documents that
      do not have a base value</li>
  </ul>

  <p>Changes since the
    <a href="http://www.w3.org/TR/2013/WD-json-ld-api-20130516/">16&nbsp;May&nbsp;2013 Last Call Working Draft</a>:</p>

  <ul>
    <li>Ensure determinism of the Deserialize JSON-LD to RDF algorithm by specifying the processing order</li>
    <li>Change the default value of the <em>use native types</em> flag in the Serialize RDF as JSON-LD
      algorithm to <code>false</code></li>
    <li>Clarify that the <i>identifier map</i> and the <i>counter</i> used by the
      Generate Blank Node Identifier algorithm are reset before running the Flattening
      and the Deserialize JSON-LD to RDF algorithms</li>
    <li>Raise an error if a blank node is used as data type</li>
    <li>Clarify that blank node identifier are supported as value of <code>@vocab</code></li>
    <li>When generating RDF, exclude <a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">triples</a> containing a
      <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank node</a> <a class="tref internalDFN" title="rdf-predicate" href="#dfn-rdf-predicate">predicate</a>, unless the
      <i>produce generalized RDF</i> flag is set; discard <a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">triples</a>
      containing relative IRIs and graphs with a relative <abbr title="Internationalized Resource Identifier">IRI</abbr> as graph name</li>
    <li>Update reference to DOM Promises (have been called DOM Futures)</li>
    <li>Fix bug in <a href="#serialize-rdf-as-json-ld-algorithm">Serialize RDF to JSON-LD algorithm</a> to
      handle lists correctly</li>
    <li>Support processing of documents with a <code>+json</code> media type as defined in
      [<cite><a class="bibref" href="#bib-RFC6839">RFC6839</a></cite>]</li>
    <li>Use the <a href="#idl-def-LoadDocumentCallback" class="idlType"><code>LoadDocumentCallback</code></a> (previously <code>LoadContextCallback</code>)
      to retrieve remote contexts and remote documents</li>
    <li>Allow contexts to be passed into the API directly. Previously only context documents, i.e.,
      objects having a <code>@context</code> member were allowed.</li>
    <li>Clarify the usage of the
      <code class="idlMemberName"><a href="#widl-JsonLdOptions-documentLoader">documentLoader</a></code> option.</li>
  </ul>

  <p>This document was published by the <a href="http://www.w3.org/2011/rdf-wg/">RDF Working Group</a> as a Candidate Recommendation.
    This document is intended to become a <abbr title="World Wide Web Consortium">W3C</abbr> Recommendation.
    If you wish to make comments regarding this document, please send them to
    <a href="mailto:public-rdf-comments@w3.org">public-rdf-comments@w3.org</a>
    (<a href="mailto:public-rdf-comments-request@w3.org?subject=subscribe">subscribe</a>,
    <a href="http://lists.w3.org/Archives/Public/public-rdf-comments/">archives</a>).
    <abbr title="World Wide Web Consortium">W3C</abbr> publishes a Candidate Recommendation to indicate that the document is believed
    to be stable and to encourage implementation by the developer community. This
    Candidate Recommendation is expected to advance to Proposed Recommendation no earlier than
    01 October 2013.
    All comments are welcome.</p>

  <p>Publication as a Candidate Recommendation does not imply endorsement by the <abbr title="World Wide Web Consortium">W3C</abbr> Membership.
    This is a draft document and may be updated, replaced or obsoleted by other documents at
    any time. It is inappropriate to cite this document as other than work in progress.</p>

  <p>Before this specification exits Candidate Recommendation, two or more
    independent implementations must pass each test, although no single
    implementation must pass each test. The working group will decide when
    the test suite is of sufficient quality to test interoperability and will
    produce an implementation report (hosted together with the test suite).</p>

  <p>This document was produced by a group operating under the
    <a id="sotd_patent" about="" rel="w3p:patentRules" href="http://www.w3.org/Consortium/Patent-Policy-20040205/">5 February 2004 <abbr title="World Wide Web Consortium">W3C</abbr> Patent Policy</a>.
    <abbr title="World Wide Web Consortium">W3C</abbr> maintains a <a href="http://www.w3.org/2004/01/pp-impl/46168/status" rel="disclosure">public list of any patent disclosures</a>
    made in connection with the deliverables of the group; that page also includes instructions for
    disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains
    <a href="http://www.w3.org/Consortium/Patent-Policy-20040205/#def-essential">Essential Claim(s)</a> must disclose the
    information in accordance with <a href="http://www.w3.org/Consortium/Patent-Policy-20040205/#sec-Disclosure">section
    6 of the <abbr title="World Wide Web Consortium">W3C</abbr> Patent Policy</a>.</p>

</section><section id="toc"><h2 class="introductory" aria-level="1" role="heading" id="h2_toc">Table of Contents</h2><ul class="toc" role="directory" id="respecContents"><li class="tocline"><a href="#introduction" class="tocxref"><span class="secno">1. </span>Introduction</a></li><li class="tocline"><a href="#features" class="tocxref"><span class="secno">2. </span>Features</a><ul class="toc"><li class="tocline"><a href="#expansion" class="tocxref"><span class="secno">2.1 </span>Expansion</a></li><li class="tocline"><a href="#compaction" class="tocxref"><span class="secno">2.2 </span>Compaction</a></li><li class="tocline"><a href="#flattening" class="tocxref"><span class="secno">2.3 </span>Flattening</a></li><li class="tocline"><a href="#rdf-serialization-deserialization" class="tocxref"><span class="secno">2.4 </span>RDF Serialization/Deserialization</a></li></ul></li><li class="tocline"><a href="#conformance" class="tocxref"><span class="secno">3. </span>Conformance</a></li><li class="tocline"><a href="#general-terminology" class="tocxref"><span class="secno">4. </span>General Terminology</a></li><li class="tocline"><a href="#algorithm-terms" class="tocxref"><span class="secno">5. </span>Algorithm Terms</a></li><li class="tocline"><a href="#context-processing-algorithms" class="tocxref"><span class="secno">6. </span>Context Processing Algorithms</a><ul class="toc"><li class="tocline"><a href="#context-processing-algorithm" class="tocxref"><span class="secno">6.1 </span>Context Processing Algorithm</a></li><li class="tocline"><a href="#create-term-definition" class="tocxref"><span class="secno">6.2 </span>Create Term Definition</a></li><li class="tocline"><a href="#iri-expansion" class="tocxref"><span class="secno">6.3 </span><abbr title="Internationalized Resource Identifier">IRI</abbr> Expansion</a></li></ul></li><li class="tocline"><a href="#expansion-algorithms" class="tocxref"><span class="secno">7. </span>Expansion Algorithms</a><ul class="toc"><li class="tocline"><a href="#expansion-algorithm" class="tocxref"><span class="secno">7.1 </span>Expansion Algorithm</a></li><li class="tocline"><a href="#value-expansion" class="tocxref"><span class="secno">7.2 </span>Value Expansion</a></li></ul></li><li class="tocline"><a href="#compaction-algorithms" class="tocxref"><span class="secno">8. </span>Compaction Algorithms</a><ul class="toc"><li class="tocline"><a href="#compaction-algorithm" class="tocxref"><span class="secno">8.1 </span>Compaction Algorithm</a></li><li class="tocline"><a href="#inverse-context-creation" class="tocxref"><span class="secno">8.2 </span>Inverse Context Creation</a></li><li class="tocline"><a href="#iri-compaction" class="tocxref"><span class="secno">8.3 </span><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction</a></li><li class="tocline"><a href="#term-selection" class="tocxref"><span class="secno">8.4 </span>Term Selection</a></li><li class="tocline"><a href="#value-compaction" class="tocxref"><span class="secno">8.5 </span>Value Compaction</a></li></ul></li><li class="tocline"><a href="#flattening-algorithms" class="tocxref"><span class="secno">9. </span>Flattening Algorithms</a><ul class="toc"><li class="tocline"><a href="#flattening-algorithm" class="tocxref"><span class="secno">9.1 </span>Flattening Algorithm</a></li><li class="tocline"><a href="#node-map-generation" class="tocxref"><span class="secno">9.2 </span>Node Map Generation</a></li><li class="tocline"><a href="#generate-blank-node-identifier" class="tocxref"><span class="secno">9.3 </span>Generate Blank Node Identifier</a></li></ul></li><li class="tocline"><a href="#rdf-serialization-deserialization-algorithms" class="tocxref"><span class="secno">10. </span>RDF Serialization/Deserialization Algorithms</a><ul class="toc"><li class="tocline"><a href="#deserialize-json-ld-to-rdf-algorithm" class="tocxref"><span class="secno">10.1 </span>Deserialize JSON-LD to RDF algorithm</a></li><li class="tocline"><a href="#object-to-rdf-conversion" class="tocxref"><span class="secno">10.2 </span>Object to RDF Conversion</a></li><li class="tocline"><a href="#list-to-rdf-conversion" class="tocxref"><span class="secno">10.3 </span>List to RDF Conversion</a></li><li class="tocline"><a href="#serialize-rdf-as-json-ld-algorithm" class="tocxref"><span class="secno">10.4 </span>Serialize RDF as JSON-LD Algorithm</a></li><li class="tocline"><a href="#rdf-to-object-conversion" class="tocxref"><span class="secno">10.5 </span>RDF to Object Conversion</a></li><li class="tocline"><a href="#data-round-tripping" class="tocxref"><span class="secno">10.6 </span>Data Round Tripping</a></li></ul></li><li class="tocline"><a href="#the-application-programming-interface" class="tocxref"><span class="secno">11. </span>The Application Programming Interface</a><ul class="toc"><li class="tocline"><a href="#the-jsonldprocessor-interface" class="tocxref"><span class="secno">11.1 </span>The <span class="formerLink"><code>JsonLdProcessor</code></span> Interface</a></li><li class="tocline"><a href="#the-jsonldoptions-type" class="tocxref"><span class="secno">11.2 </span>The <span class="formerLink"><code>JsonLdOptions</code></span> Type</a></li><li class="tocline"><a href="#remote-document-and-context-retrieval" class="tocxref"><span class="secno">11.3 </span>Remote Document and Context Retrieval</a></li><li class="tocline"><a href="#error-handling" class="tocxref"><span class="secno">11.4 </span>Error Handling</a></li></ul></li><li class="tocline"><a href="#acknowledgements" class="tocxref"><span class="secno">A. </span>Acknowledgements</a></li><li class="tocline"><a href="#references" class="tocxref"><span class="secno">B. </span>References</a><ul class="toc"><li class="tocline"><a href="#normative-references" class="tocxref"><span class="secno">B.1 </span>Normative references</a></li><li class="tocline"><a href="#informative-references" class="tocxref"><span class="secno">B.2 </span>Informative references</a></li></ul></li></ul></section>




<section class="informative" id="introduction">
  <!--OddPage--><h2 aria-level="1" role="heading" id="h2_introduction"><span class="secno">1. </span>Introduction</h2><p><em>This section is non-normative.</em></p>

  <p>This document is a detailed specification for an Application Programming
    Interface for the JSON-LD syntax. The document is primarily intended for
    the following audiences:</p>

  <ul>
    <li>Developers who want an overview of the JSON-LD API.</li>
    <li>Web authors and developers who want a very detailed view of how
      a <a class="tref internalDFN" title="json-ld-processor" href="#dfn-json-ld-processor">JSON-LD Processor</a> or a <a class="tref internalDFN" title="json-ld-api-implementation" href="#dfn-json-ld-api-implementation">JSON-LD API Implementation</a>
      operates.</li>
    <li>Software developers who want to implement the algorithms to transform
      JSON-LD documents.</li>
  </ul>

  <p>To understand the basics in this specification you must first be familiar with
    JSON, which is detailed in [<cite><a class="bibref" href="#bib-RFC4627">RFC4627</a></cite>]. You must also understand the
    JSON-LD syntax defined in [<cite><a class="bibref" href="#bib-JSON-LD">JSON-LD</a></cite>], which is the base syntax used by all
    of the algorithms in this document. To understand the API and how it is
    intended to operate in a programming environment, it is useful to have working
    knowledge of the JavaScript programming language [<cite><a class="bibref" href="#bib-ECMA-262">ECMA-262</a></cite>] and
    WebIDL [<cite><a class="bibref" href="#bib-WEBIDL">WEBIDL</a></cite>]. To understand how JSON-LD maps to RDF, it is helpful to be
    familiar with the basic RDF concepts [<cite><a class="bibref" href="#bib-RDF11-CONCEPTS">RDF11-CONCEPTS</a></cite>].</p>
</section> <!-- end of Introduction -->


<section class="informative" id="features">
  <!--OddPage--><h2 aria-level="1" role="heading" id="h2_features"><span class="secno">2. </span>Features</h2><p><em>This section is non-normative.</em></p>

  <p>The JSON-LD Syntax specification [<cite><a class="bibref" href="#bib-JSON-LD">JSON-LD</a></cite>] defines a syntax to
    express Linked Data in JSON. Because there is more than one way to
    express Linked Data using this syntax, it is often useful to be able to
    transform JSON-LD documents so that they may be more easily consumed by
    specific applications.</p>

  <p>JSON-LD uses <a class="tref internalDFN" title="context" href="#dfn-context">contexts</a> to allow Linked Data
    to be expressed in a way that is specifically tailored to a particular
    person or application. By providing a <a class="tref internalDFN" title="context" href="#dfn-context">context</a>,
    JSON data can be expressed in a way that is a natural fit for a particular
    person or application whilst also indicating how the data should be
    understood at a global scale. In order for people or applications to
    share data that was created using a <a class="tref internalDFN" title="context" href="#dfn-context">context</a> that is different
    from their own, a JSON-LD processor must be able to transform a document
    from one <a class="tref internalDFN" title="context" href="#dfn-context">context</a> to another. Instead of requiring JSON-LD
    processors to write specific code for every imaginable
    <a class="tref internalDFN" title="context" href="#dfn-context">context</a> switching scenario, it is much easier to specify a
    single algorithm that can remove any <a class="tref internalDFN" title="context" href="#dfn-context">context</a>. Similarly,
    another algorithm can be specified to subsequently apply any
    <a class="tref internalDFN" title="context" href="#dfn-context">context</a>. These two algorithms represent the most basic
    transformations of JSON-LD documents. They are referred to as
    <a class="tref internalDFN" title="expansion" href="#dfn-expansion">expansion</a> and <a class="tref internalDFN" title="compaction" href="#dfn-compaction">compaction</a>, respectively.</p>

  <p>There are four major types of transformation that are discussed in this
    document: expansion, compaction, flattening, and RDF serialization/deserialization.</p>

  <section class="informative" id="expansion">
    <h3 aria-level="2" role="heading" id="h3_expansion"><span class="secno">2.1 </span>Expansion</h3><p><em>This section is non-normative.</em></p>

    <p>The algorithm that removes <a class="tref internalDFN" title="context" href="#dfn-context">context</a> is
      called <dfn title="expansion" id="dfn-expansion">expansion</dfn>. Before performing any other
      transformations on a JSON-LD document, it is easiest to
      remove any <a class="tref internalDFN" title="context" href="#dfn-context">context</a> from it and to make data structures
      more regular.</p>

    <p>To get an idea of how context and data structuring affects the same data,
      here is an example of JSON-LD that uses only <a class="tref internalDFN" title="term" href="#dfn-term">terms</a>
      and is fairly compact:</p>

    <div class="example"><div class="example-title"><span>Example 1</span>: Sample JSON-LD document</div><pre class="example">{
  "@context": {
    "name": "http://xmlns.com/foaf/0.1/name",
    "homepage": {
      "@id": "http://xmlns.com/foaf/0.1/homepage",
      "@type": "@id"
    }
  },
  "@id": "http://me.markus-lanthaler.com/",
  "name": "Markus Lanthaler",
  "homepage": "http://www.markus-lanthaler.com/"
}</pre></div>

    <p>The next input example uses one <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> to express a property
    and an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> to encapsulate another, but
    leaves the rest of the information untouched.</p>

    <div class="example"><div class="example-title"><span>Example 2</span>: Sample JSON-LD document using an IRI instead of a term to express a property</div><pre class="example">{
  "@context": {
    <span class="diff">"website": "http://xmlns.com/foaf/0.1/homepage"</span>
  },
  "@id": "http://me.markus-lanthaler.com/",
  "<span class="diff">http://xmlns.com/foaf/0.1/name</span>": "Markus Lanthaler",
  <span class="diff">"website"</span>: <span class="diff">{ "@id":</span> "http://www.markus-lanthaler.com/" <span class="diff">}</span>
}</pre></div>

    <p>Note that both inputs are valid JSON-LD and both represent the same
      information. The difference is in their <a class="tref internalDFN" title="context" href="#dfn-context">context</a> information
      and in the data structures used. A JSON-LD processor can remove
      <a class="tref internalDFN" title="context" href="#dfn-context">context</a> and ensure that the data is more regular by employing
      <a class="tref internalDFN" title="expansion" href="#dfn-expansion">expansion</a>.</p>

    <p><a class="tref internalDFN" title="expansion" href="#dfn-expansion">Expansion</a> has two important goals: removing any contextual
      information from the document, and ensuring all values are represented
      in a regular form. These goals are accomplished by expanding all properties
      to <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute IRIs</a> and by expressing all
      values in <a class="tref internalDFN" title="array" href="#dfn-array">arrays</a> in
      <a class="tref internalDFN" title="expanded-form" href="#dfn-expanded-form">expanded form</a>. <a class="tref internalDFN" title="expanded-form" href="#dfn-expanded-form">Expanded form</a> is the most verbose
      and regular way of expressing of values in JSON-LD; all contextual
      information from the document is instead stored locally with each value.
      Running the <a href="#expansion-algorithm">Expansion algorithm</a>
      (<code class="idlMemberName"><a href="#widl-JsonLdProcessor-expand-Promise-any-input-JsonLdOptions-options">expand</a></code>
      operation) against the above examples results in the following output:</p>

    <div class="example"><div class="example-title"><span>Example 3</span>: Expanded sample document</div><pre class="example">[
  {
    "@id": "http://me.markus-lanthaler.com/",
    "http://xmlns.com/foaf/0.1/name": [
      { "@value": "Markus Lanthaler" }
    ],
    "http://xmlns.com/foaf/0.1/homepage": [
      { "@id": "http://www.markus-lanthaler.com/" }
    ]
  }
]</pre></div>

    <p>Note that in the output above all <a class="tref internalDFN" title="context" href="#dfn-context">context</a> definitions have
      been removed, all <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> and
      <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact IRIs</a> have been expanded to absolute
      <a class="tref internalDFN" title="iri" href="#dfn-iri">IRIs</a>, and all
      <a class="tref internalDFN" title="json-ld-value" href="#dfn-json-ld-value">JSON-LD values</a> are expressed in
      <a class="tref internalDFN" title="array" href="#dfn-array">arrays</a> in <a class="tref internalDFN" title="expanded-form" href="#dfn-expanded-form">expanded form</a>. While the
      output is more verbose and difficult for a human to read, it establishes a
      baseline that makes JSON-LD processing easier because of its very regular
      structure.</p>
  </section> <!-- end of Expansion -->

  <section class="informative" id="compaction">
    <h3 aria-level="2" role="heading" id="h3_compaction"><span class="secno">2.2 </span>Compaction</h3><p><em>This section is non-normative.</em></p>

    <p>While <a class="tref internalDFN" title="expansion" href="#dfn-expansion">expansion</a> removes <a class="tref internalDFN" title="context" href="#dfn-context">context</a> from a given
      input, <a class="tref internalDFN" title="compaction" href="#dfn-compaction">compaction's</a> primary function is to
      perform the opposite operation: to express a given input according to
      a particular <a class="tref internalDFN" title="context" href="#dfn-context">context</a>. <dfn title="compaction" id="dfn-compaction">Compaction</dfn> applies a
      <a class="tref internalDFN" title="context" href="#dfn-context">context</a> that specifically tailors the way information is
      expressed for a particular person or application. This simplifies applications
      that consume JSON or JSON-LD by expressing the data in application-specific
      terms, and it makes the data easier to read by humans.</p>

    <p><a class="tref internalDFN" title="compaction" href="#dfn-compaction">Compaction</a> uses a developer-supplied <a class="tref internalDFN" title="context" href="#dfn-context">context</a> to
      shorten <a class="tref internalDFN" title="iri" href="#dfn-iri">IRIs</a> to <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> or
      <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact IRIs</a> and
      <a class="tref internalDFN" title="json-ld-value" href="#dfn-json-ld-value">JSON-LD values</a> expressed in
      <a class="tref internalDFN" title="expanded-form" href="#dfn-expanded-form">expanded form</a> to simple values such as <a class="tref internalDFN" title="string" href="#dfn-string">strings</a>
      or <a class="tref internalDFN" title="number" href="#dfn-number">numbers</a>.</p>

    <p>For example, assume the following expanded JSON-LD input document:</p>

    <div class="example"><div class="example-title"><span>Example 4</span>: Expanded sample document</div><pre class="example">[
  {
    "@id": "http://me.markus-lanthaler.com/",
    "http://xmlns.com/foaf/0.1/name": [
      { "@value": "Markus Lanthaler" }
    ],
    "http://xmlns.com/foaf/0.1/homepage": [
      { "@id": "http://www.markus-lanthaler.com/" }
    ]
  }
]</pre></div>

    <p>Additionally, assume the following developer-supplied JSON-LD
      <a class="tref internalDFN" title="context" href="#dfn-context">context</a>:</p>

    <div class="example"><div class="example-title"><span>Example 5</span>: JSON-LD context</div><pre class="example">{
  "@context": {
    "name": "http://xmlns.com/foaf/0.1/name",
    "homepage": {
      "@id": "http://xmlns.com/foaf/0.1/homepage",
      "@type": "@id"
    }
  }
}</pre></div>

    <p>Running the <a href="#compaction-algorithm">Compaction Algorithm</a>
      (<code class="idlMemberName"><a href="#widl-JsonLdProcessor-compact-Promise-any-input-JsonLdContext-context-JsonLdOptions-options">compact</a></code>
      operation) given the context supplied above against the JSON-LD input
      document provided above would result in the following output:</p>

    <div class="example"><div class="example-title"><span>Example 6</span>: Compacted sample document</div><pre class="example">{
  "@context": {
    "name": "http://xmlns.com/foaf/0.1/name",
    "homepage": {
      "@id": "http://xmlns.com/foaf/0.1/homepage",
      "@type": "@id"
    }
  },
  "@id": "http://me.markus-lanthaler.com/",
  "name": "Markus Lanthaler",
  "homepage": "http://www.markus-lanthaler.com/"
}</pre></div>

    <p>Note that all <a class="tref internalDFN" title="iri" href="#dfn-iri">IRIs</a> have been compacted to
      <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> as specified in the <a class="tref internalDFN" title="context" href="#dfn-context">context</a>,
      which has been injected into the output. While compacted output is
      useful to humans, it is also used to generate structures that are easy to
      program against. Compaction enables developers to map any expanded document
      into an application-specific compacted document. While the context provided
      above mapped <code>http://xmlns.com/foaf/0.1/name</code> to <code>name</code>, it
      could also have been mapped to any other term provided by the developer.</p>
  </section> <!-- end of Compaction -->

  <section class="informative" id="flattening">
    <h3 aria-level="2" role="heading" id="h3_flattening"><span class="secno">2.3 </span>Flattening</h3><p><em>This section is non-normative.</em></p>

    <p>While expansion ensures that a document is in a uniform structure,
      flattening goes a step further to ensure that the shape of the data
      is deterministic. In expanded documents, the properties of a single
      <a class="tref internalDFN" title="node" href="#dfn-node">node</a> may be spread across a number of different
      <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON objects</a>. By flattening a
      document, all properties of a <a class="tref internalDFN" title="node" href="#dfn-node">node</a> are collected in a single
      <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> and all <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank nodes</a>
      are labeled with a <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>. This may drastically
      simplify the code required to process JSON-LD data in certain applications.</p>

    <p>For example, assume the following JSON-LD input document:</p>

    <div class="example"><div class="example-title"><span>Example 7</span>: Sample JSON-LD document</div><pre class="example">{
  "@context": {
    "name": "http://xmlns.com/foaf/0.1/name",
    "knows": "http://xmlns.com/foaf/0.1/knows"
  },
  "@id": "http://me.markus-lanthaler.com/",
  "name": "Markus Lanthaler",
  "knows": [
    {
      "name": "Dave Longley"
    }
  ]
}</pre></div>

    <p>Running the <a href="#flattening-algorithm">Flattening algorithm</a>
      (<code class="idlMemberName"><a href="#widl-JsonLdProcessor-flatten-Promise-any-input-JsonLdContext-context-JsonLdOptions-options">flatten</a></code>
      operation) with a context set to <a class="tref internalDFN" title="null" href="#dfn-null">null</a> to prevent compaction
      returns the following document:</p>

    <div class="example"><div class="example-title"><span>Example 8</span>: Flattened sample document in expanded form</div><pre class="example">[
  {
    "@id": "_:t0",
    "http://xmlns.com/foaf/0.1/name": [
      { "@value": "Dave Longley" }
    ]
  },
  {
    "@id": "http://me.markus-lanthaler.com/",
    "http://xmlns.com/foaf/0.1/name": [
      { "@value": "Markus Lanthaler" }
    ],
    "http://xmlns.com/foaf/0.1/knows": [
      { "@id": "_:t0" }
    ]
  }
]</pre></div>

    <p>Note how in the output above all properties of a <a class="tref internalDFN" title="node" href="#dfn-node">node</a> are collected in a
      single <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> and how the <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank node</a> representing
      "Dave Longley" has been assigned the <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>
      <code>_:t0</code>.</p>

    <p>To make it easier for humans to read or for certain applications to
      process it, a flattened document can be compacted by passing a context. Using
      the same context as the input document, the flattened and compacted document
      looks as follows:</p>

    <div class="example"><div class="example-title"><span>Example 9</span>: Flattened and compacted sample document</div><pre class="example">{
  "@context": {
    "name": "http://xmlns.com/foaf/0.1/name",
    "knows": "http://xmlns.com/foaf/0.1/knows"
  },
  "@graph": [
    {
      "@id": "_:t0",
      "name": "Dave Longley"
    },
    {
      "@id": "http://me.markus-lanthaler.com/",
      "name": "Markus Lanthaler",
      "knows": { "@id": "_:t0" }
    }
  ]
}</pre></div>

    <p>Please note that the result of flattening and compacting a document
      is always a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> which contains an <code>@graph</code>
      member that represents the <a class="tref internalDFN" title="default-graph" href="#dfn-default-graph">default graph</a>.</p>
  </section> <!-- end of Flattening -->

  <section class="informative" id="rdf-serialization-deserialization">
    <h3 aria-level="2" role="heading" id="h3_rdf-serialization-deserialization"><span class="secno">2.4 </span>RDF Serialization/Deserialization</h3><p><em>This section is non-normative.</em></p>

    <p>JSON-LD can be used to serialize RDF data as described in
      [<cite><a class="bibref" href="#bib-RDF11-CONCEPTS">RDF11-CONCEPTS</a></cite>]. This ensures that data can be round-tripped to and from
      any RDF syntax without any loss in fidelity.</p>

    <p>For example, assume the following RDF input serialized in Turtle [<cite><a class="bibref" href="#bib-TURTLE">TURTLE</a></cite>]:</p>

    <div class="example"><div class="example-title"><span>Example 10</span>: Sample Turtle document</div><pre class="example">&lt;http://me.markus-lanthaler.com/&gt; &lt;http://xmlns.com/foaf/0.1/name&gt; "Markus Lanthaler" .
&lt;http://me.markus-lanthaler.com/&gt; &lt;http://xmlns.com/foaf/0.1/homepage&gt; &lt;http://www.markus-lanthaler.com/&gt; .</pre></div>

    <p>Using the <a href="#serialize-rdf-as-json-ld-algorithm">Serialize RDF as JSON-LD algorithm</a>
      a developer could transform this document into expanded JSON-LD:</p>

    <div class="example"><div class="example-title"><span>Example 11</span>: Sample Turtle document converted to JSON-LD</div><pre class="example">[
  {
    "@id": "http://me.markus-lanthaler.com/",
    "http://xmlns.com/foaf/0.1/name": [
      { "@value": "Markus Lanthaler" }
    ],
    "http://xmlns.com/foaf/0.1/homepage": [
      { "@id": "http://www.markus-lanthaler.com/" }
    ]
  }
]</pre></div>

    <p>Note that the output above could easily be compacted using the technique outlined
      in the previous section. It is also possible to deserialize the JSON-LD document back
      to RDF using the <a href="#deserialize-json-ld-to-rdf-algorithm">Deserialize JSON-LD to RDF algorithm</a>.</p>
  </section> <!-- end of RDF Serialization/Deserialization -->
</section> <!-- end of Features section -->


<section id="conformance">
  <!--OddPage--><h2 aria-level="1" role="heading" id="h2_conformance"><span class="secno">3. </span>Conformance</h2>

  <p>All examples and notes as well as sections marked as non-normative in this
    specification are non-normative. Everything else in this specification is
    normative.</p>

  <p>The keywords <em class="rfc2119" title="MUST">MUST</em>, <em class="rfc2119" title="MUST NOT">MUST NOT</em>, <em class="rfc2119" title="REQUIRED">REQUIRED</em>, <em class="rfc2119" title="SHOULD">SHOULD</em>, <em class="rfc2119" title="SHOULD NOT">SHOULD NOT</em>, <em class="rfc2119" title="RECOMMENDED">RECOMMENDED</em>,
    <em class="rfc2119" title="MAY">MAY</em>, and <em class="rfc2119" title="OPTIONAL">OPTIONAL</em> in this specification are to be interpreted as described
    in [<cite><a class="bibref" href="#bib-RFC2119">RFC2119</a></cite>].</p>

  <p>There are three classes of products that can claim conformance to this
    specification: <a class="tref internalDFN" title="json-ld-processor" href="#dfn-json-ld-processor">JSON-LD Processors</a>,
    <a class="tref internalDFN" title="json-ld-api-implementation" href="#dfn-json-ld-api-implementation">JSON-LD API Implementations</a>,
    and <a class="tref internalDFN" title="rdf-serializer/deserializer" href="#dfn-rdf-serializer/deserializer">RDF Serializers/Deserializers</a>.</p>

  <p>A conforming <dfn title="json-ld-processor" id="dfn-json-ld-processor">JSON-LD Processor</dfn> is a system which can perform the
    <a href="#expansion-algorithm">Expansion</a>, <a href="#compaction-algorithm">Compaction</a>,
    and <a href="#flattening-algorithm">Flattening</a> operations defined in this specification.</p>

  <p>A conforming <dfn title="json-ld-api-implementation" id="dfn-json-ld-api-implementation">JSON-LD API Implementation</dfn> is a conforming <a class="tref internalDFN" title="json-ld-processor" href="#dfn-json-ld-processor">JSON-LD Processor</a>
    that exposes the <a href="#the-application-programming-interface">Application Programming Interface (API)</a>
    defined in this specification. It <em class="rfc2119" title="MUST">MUST</em> implement the <code>json-ld-1.0</code>
    processing mode (for further details, see the
    <code class="idlMemberName"><a href="#widl-JsonLdOptions-processingMode">processingMode</a></code>
    option of <a href="#idl-def-JsonLdOptions" class="idlType"><code>JsonLdOptions</code></a>).</p>

  <p><a class="tref internalDFN" title="json-ld-processor" href="#dfn-json-ld-processor">JSON-LD Processors</a> and
    <a class="tref internalDFN" title="json-ld-api-implementation" href="#dfn-json-ld-api-implementation">API Implementations</a> <em class="rfc2119" title="MUST NOT">MUST NOT</em>
    attempt to correct malformed <a class="tref internalDFN" title="iri" href="#dfn-iri">IRIs</a> or language tags;
    however, they <em class="rfc2119" title="MAY">MAY</em> issue validation warnings. IRIs are not modified other
    than conversion between <a class="tref internalDFN" title="relative-iri" href="#dfn-relative-iri">relative</a> and
    <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute IRIs</a>.</p>

  <p>A conforming <dfn title="rdf-serializer/deserializer" id="dfn-rdf-serializer/deserializer">RDF Serializer/Deserializer</dfn> is a system that can
    <a href="#deserialize-json-ld-to-rdf-algorithm">deserialize JSON-LD to RDF</a> and
    <a href="#serialize-rdf-as-json-ld-algorithm">serialize RDF as JSON-LD</a> as
    defined in this specification.</p>

  <p>The algorithms in this specification are generally written with more concern for clarity
    than efficiency. Thus, <a class="tref internalDFN" title="json-ld-processor" href="#dfn-json-ld-processor">JSON-LD Processors</a>
    and <a class="tref internalDFN" title="json-ld-api-implementation" href="#dfn-json-ld-api-implementation">API Implementations</a> may
    implement the algorithms given in this specification in any way desired,
    so long as the end result is indistinguishable from the result that would
    be obtained by the specification's algorithms.</p>

  <div class="note"><div class="note-title" aria-level="2" role="heading" id="h_note_1"><span>Note</span></div><p class="">Implementers can partially check their level of conformance to
    this specification by successfully passing the test cases of the JSON-LD test
    suite [<cite><a class="bibref" href="#bib-JSON-LD-TESTS">JSON-LD-TESTS</a></cite>]. Note, however, that passing all the tests in the test
    suite does not imply complete conformance to this specification. It only implies
    that the implementation conforms to aspects tested by the test suite.</p></div>
</section> <!-- end of Conformance section -->


<section id="general-terminology">
  <!--OddPage--><h2 aria-level="1" role="heading" id="h2_general-terminology"><span class="secno">4. </span>General Terminology</h2>

  <p>This document uses the following terms as defined in JSON [<cite><a class="bibref" href="#bib-RFC4627">RFC4627</a></cite>]. Refer
    to the <em>JSON Grammar</em> section in [<cite><a class="bibref" href="#bib-RFC4627">RFC4627</a></cite>] for formal definitions.</p>

  <dl>
    <dt><dfn title="json-object" id="dfn-json-object">JSON object</dfn></dt>
    <dd>An object structure is represented as a pair of curly brackets surrounding
      zero or more key-value pairs. A key is a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>.
      A single colon comes after each key, separating the key from the value.
      A single comma separates a value from a following key. In contrast to JSON,
      in JSON-LD the keys in an object must be unique.</dd>
    <dt><dfn title="array" id="dfn-array">array</dfn></dt>
    <dd>An array structure is represented as square brackets surrounding zero
      or more values. Values are separated by commas.
      In JSON, an array is an <em>ordered</em> sequence of zero or more values.
      While JSON-LD uses the same array representation as JSON,
      the collection is <em>unordered</em> by default. While order is
      preserved in regular JSON arrays, it is not in regular JSON-LD arrays
      unless specifically defined (see
      <cite><a href="http://www.w3.org/TR/2013/CR-json-ld-20130910/#sets-and-lists">Sets and Lists</a></cite> in
      the JSON-LD specification [<cite><a class="bibref" href="#bib-JSON-LD">JSON-LD</a></cite>]).</dd>
    <dt><dfn title="string" id="dfn-string">string</dfn></dt>
    <dd>A string is a sequence of zero or more Unicode characters,
      wrapped in double quotes, using backslash escapes (if necessary). A
      character is represented as a single character string.</dd>
    <dt><dfn title="number" id="dfn-number">number</dfn></dt>
    <dd>A number is similar to that used in most programming languages, except
      that the octal and hexadecimal formats are not used and that leading
      zeros are not allowed.</dd>
    <dt><dfn title="true" id="dfn-true">true</dfn> and <dfn title="false" id="dfn-false">false</dfn></dt>
    <dd>Values that are used to express one of two possible boolean states.</dd>
    <dt><dfn title="null" id="dfn-null">null</dfn></dt>
    <dd>The <a class="tref internalDFN" title="null" href="#dfn-null">null</a> value. A key-value pair in the
      <code>@context</code> where the value, or the <code>@id</code> of the
      value, is <a class="tref internalDFN" title="null" href="#dfn-null">null</a> explicitly decouples a term's association
      with an <abbr title="Internationalized Resource Identifier">IRI</abbr>. A key-value pair in the body of a JSON-LD document whose
      value is <a class="tref internalDFN" title="null" href="#dfn-null">null</a> has the same meaning as if the key-value pair
      was not defined. If <code>@value</code>, <code>@list</code>, or
      <code>@set</code> is set to <a class="tref internalDFN" title="null" href="#dfn-null">null</a> in expanded form, then
      the entire <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> is ignored.</dd>
  </dl>

  <p>Furthermore, the following terminology is used throughout this document:</p>

  <dl>
    <dt><dfn title="keyword" id="dfn-keyword">keyword</dfn></dt>
    <dd>A JSON key that is specific to JSON-LD, specified in the section
      <cite><a href="http://www.w3.org/TR/2013/CR-json-ld-20130910/#syntax-tokens-and-keywords">Syntax Tokens and Keywords</a></cite>
      of the JSON-LD specification [<cite><a class="bibref" href="#bib-JSON-LD">JSON-LD</a></cite>].</dd>
    <dt><dfn title="context" id="dfn-context">context</dfn></dt>
    <dd>A set of rules for interpreting a JSON-LD document as specified in the section
      <cite><a href="http://www.w3.org/TR/2013/CR-json-ld-20130910/#the-context">The Context</a></cite> of the JSON-LD
      specification [<cite><a class="bibref" href="#bib-JSON-LD">JSON-LD</a></cite>].</dd>
    <dt><dfn title="json-ld-document" id="dfn-json-ld-document">JSON-LD document</dfn></dt>
    <dd>A <a class="tref internalDFN" title="json-ld-document" href="#dfn-json-ld-document">JSON-LD document</a> is a serialization of a collection of
      <a class="tref internalDFN" title="graph" href="#dfn-graph">graphs</a> and comprises exactly one
      <a class="tref internalDFN" title="default-graph" href="#dfn-default-graph">default graph</a> and zero or more <a class="tref internalDFN" title="named-graph" href="#dfn-named-graph">named graphs</a>.</dd>
    <dt><dfn title="named-graph" id="dfn-named-graph">named graph</dfn></dt>
    <dd>A named graph is a pair consisting of an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> or <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank node</a>
      (the <dfn title="graph-name" id="dfn-graph-name">graph name</dfn>) and a <a class="tref internalDFN" title="graph" href="#dfn-graph">graph</a>.</dd>
    <dt><dfn title="default-graph" id="dfn-default-graph">default graph</dfn></dt>
    <dd>The default graph is the only graph in a JSON-LD document which has no <a class="tref internalDFN" title="graph-name" href="#dfn-graph-name">graph name</a>.</dd>
    <dt><dfn title="graph" id="dfn-graph">Graph</dfn></dt>
    <dd>A labeled directed graph, i.e., a set of <a class="tref internalDFN" title="node" href="#dfn-node">nodes</a>
      connected by <a class="tref internalDFN" title="edge" href="#dfn-edge">edges</a>,
      as specified in the <cite><a href="http://www.w3.org/TR/2013/CR-json-ld-20130910/#data-model">Data Model</a></cite>
      section of the JSON-LD specification [<cite><a class="bibref" href="#bib-JSON-LD">JSON-LD</a></cite>].</dd>
    <dt><dfn title="edge" id="dfn-edge">edge</dfn></dt>
    <dd>Every <a class="tref internalDFN" title="edge" href="#dfn-edge">edge</a> has a direction associated with it and is labeled with
      an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> or a <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>. Within the JSON-LD syntax
      these edge labels are called <dfn title="property" id="dfn-property">properties</dfn>. Whenever possible, an
      <a class="tref internalDFN" title="edge" href="#dfn-edge">edge</a> should be labeled with an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</dd>
    <dt><dfn title="node" id="dfn-node">node</dfn></dt>
    <dd>Every <a class="tref internalDFN" title="node" href="#dfn-node">node</a> is an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>, a <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank node</a>,
      a <a class="tref internalDFN" title="json-ld-value" href="#dfn-json-ld-value">JSON-LD value</a>, or a <a class="tref internalDFN" title="list" href="#dfn-list">list</a>.</dd>
    <dt><dfn title="iri" id="dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></dfn></dt>
    <dd>An <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> (Internationalized Resource Identifier) is a string that conforms to the syntax
      defined in [<cite><a class="bibref" href="#bib-RFC3987">RFC3987</a></cite>].</dd>
    <dt><dfn title="absolute-iri" id="dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></dfn></dt>
    <dd>An absolute <abbr title="Internationalized Resource Identifier">IRI</abbr> is defined in [<cite><a class="bibref" href="#bib-RFC3987">RFC3987</a></cite>] containing a <em>scheme</em> along with a <em>path</em> and
      optional <em>query</em> and fragment segments.</dd>
    <dt><dfn title="relative-iri" id="dfn-relative-iri">relative <abbr title="Internationalized Resource Identifier">IRI</abbr></dfn></dt>
    <dd>A relative <abbr title="Internationalized Resource Identifier">IRI</abbr> is an <abbr title="Internationalized Resource Identifier">IRI</abbr> that is relative to some other <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</dd>
    <dt><dfn title="blank-node" id="dfn-blank-node">blank node</dfn></dt>
    <dd>A <a class="tref internalDFN" title="node" href="#dfn-node">node</a> in a <a class="tref internalDFN" title="graph" href="#dfn-graph">graph</a> that is neither an
      <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>, nor a <a class="tref internalDFN" title="json-ld-value" href="#dfn-json-ld-value">JSON-LD value</a>, nor a <a class="tref internalDFN" title="list" href="#dfn-list">list</a>.</dd>
    <dt><dfn title="blank-node-identifier" id="dfn-blank-node-identifier">blank node identifier</dfn></dt>
    <dd>A blank node identifier is a string that can be used as an identifier for a
      <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank node</a> within the scope of a JSON-LD document. Blank node identifiers
      begin with <code>_:</code>.</dd>
    <dt><dfn title="json-ld-value" id="dfn-json-ld-value">JSON-LD value</dfn></dt>
    <dd>A <a class="tref internalDFN" title="json-ld-value" href="#dfn-json-ld-value">JSON-LD value</a> is a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, a <a class="tref internalDFN" title="number" href="#dfn-number">number</a>,
      <a class="tref internalDFN" title="true" href="#dfn-true">true</a> or <a class="tref internalDFN" title="false" href="#dfn-false">false</a>, a <a class="tref internalDFN" title="typed-value" href="#dfn-typed-value">typed value</a>, or a
      <a class="tref internalDFN" title="language-tagged-string" href="#dfn-language-tagged-string">language-tagged string</a>.</dd>
    <dt><dfn title="typed-value" id="dfn-typed-value">typed value</dfn></dt>
    <dd>A <a class="tref internalDFN" title="typed-value" href="#dfn-typed-value">typed value</a> consists of a value, which is a string, and a type,
      which is an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</dd>
    <dt><dfn title="language-tagged-string" id="dfn-language-tagged-string">language-tagged string</dfn></dt>
    <dd>A <a class="tref internalDFN" title="language-tagged-string" href="#dfn-language-tagged-string">language-tagged string</a> consists of a string and a non-empty language
      tag as defined by [<cite><a class="bibref" href="#bib-BCP47">BCP47</a></cite>]. The language tag must be well-formed according to
      <a href="http://tools.ietf.org/html/bcp47#section-2.2.9">section 2.2.9 Classes of Conformance</a>
      of [<cite><a class="bibref" href="#bib-BCP47">BCP47</a></cite>], and is normalized to lowercase.</dd>
    <dt><dfn title="list" id="dfn-list">list</dfn></dt>
    <dd>A <a class="tref internalDFN" title="list" href="#dfn-list">list</a> is an ordered sequence of <a class="tref internalDFN" title="iri" href="#dfn-iri">IRIs</a>,
      <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank nodes</a>, and
      <a class="tref internalDFN" title="json-ld-value" href="#dfn-json-ld-value">JSON-LD values</a>.</dd>
  </dl>
</section> <!-- end of General Terminology section -->


<section id="algorithm-terms">
  <!--OddPage--><h2 aria-level="1" role="heading" id="h2_algorithm-terms"><span class="secno">5. </span>Algorithm Terms</h2>

  <dl>
    <dt><dfn title="active-graph" id="dfn-active-graph">active graph</dfn></dt>
    <dd>The name of the currently active graph that the processor should use when
      processing.</dd>
    <dt><dfn title="active-subject" id="dfn-active-subject">active subject</dfn></dt>
    <dd>The currently active subject that the processor should use when
      processing.</dd>
    <dt><dfn title="active-property" id="dfn-active-property">active property</dfn></dt>
    <dd>The currently active <a class="tref internalDFN" title="property" href="#dfn-property">property</a> or <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a> that
      the processor should use when processing.</dd>
    <dt><dfn title="active-context" id="dfn-active-context">active context</dfn></dt>
    <dd>A context that is used to resolve <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> while
      the processing algorithm is running.</dd>
    <dt><dfn title="local-context" id="dfn-local-context">local context</dfn></dt>
    <dd>A context that is specified within a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>,
      specified via the <code>@context</code> <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a>.</dd>
    <dt><dfn title="json-ld-input" id="dfn-json-ld-input">JSON-LD input</dfn></dt>
    <dd>The JSON-LD data structure that is provided as input to the algorithm.</dd>
    <dt><dfn title="term" id="dfn-term">term</dfn></dt>
    <dd>A <a class="tref internalDFN" title="term" href="#dfn-term">term</a> is a short word defined in a context that may be expanded to
      an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a></dd>
    <dt><dfn title="compact-iri" id="dfn-compact-iri">compact <abbr title="Internationalized Resource Identifier">IRI</abbr></dfn></dt>
    <dd>A compact <abbr title="Internationalized Resource Identifier">IRI</abbr> has the form of <dfn title="prefix" id="dfn-prefix">prefix</dfn>:<em>suffix</em> and is used as a way
      of expressing an <abbr title="Internationalized Resource Identifier">IRI</abbr> without needing to define separate <a class="tref internalDFN" title="term" href="#dfn-term">term</a> definitions for
      each <abbr title="Internationalized Resource Identifier">IRI</abbr> contained within a common vocabulary identified by <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a>.</dd>
    <dt><dfn title="node-object" id="dfn-node-object">node object</dfn></dt>
    <dd>A <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a> represents zero or more properties of a
      <a class="tref internalDFN" title="node" href="#dfn-node">node</a> in the <a class="tref internalDFN" title="graph" href="#dfn-graph">graph</a> serialized by the
      JSON-LD document. A <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> is a <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a>
      if it exists outside of the JSON-LD <a class="tref internalDFN" title="context" href="#dfn-context">context</a> and:
      <ul>
        <li>it does not contain the <code>@value</code>, <code>@list</code>,
          or <code>@set</code> keywords, or</li>
        <li>it is not the top-most <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> in the JSON-LD document consisting
          of no other members than <code>@graph</code> and <code>@context</code>.</li>
      </ul>
    </dd>
    <dt><dfn title="value-object" id="dfn-value-object">value object</dfn></dt>
    <dd>A <a class="tref internalDFN" title="value-object" href="#dfn-value-object">value object</a> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> that has an <code>@value</code>
      member.</dd>
    <dt><dfn title="list-object" id="dfn-list-object">list object</dfn></dt>
    <dd>A <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> that has an <code>@list</code>
      member.</dd>
    <dt><dfn title="set-object" id="dfn-set-object">set object</dfn></dt>
    <dd>A <a class="tref internalDFN" title="set-object" href="#dfn-set-object">set object</a> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> that has an <code>@set</code>
      member.</dd>
    <dt><dfn title="scalar" id="dfn-scalar">scalar</dfn></dt>
    <dd>A scalar is either a JSON <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, <a class="tref internalDFN" title="number" href="#dfn-number">number</a>, <a class="tref internalDFN" title="true" href="#dfn-true">true</a>,
      or <a class="tref internalDFN" title="false" href="#dfn-false">false</a>.</dd>
    <dt><dfn title="rdf-subject" id="dfn-rdf-subject">RDF subject</dfn></dt>
    <dd>A <a class="tref externalDFN" title="subject" href="http://www.w3.org/TR/rdf11-concepts/#dfn-subject">subject</a>
      as specified by [<cite><a class="bibref" href="#bib-RDF11-CONCEPTS">RDF11-CONCEPTS</a></cite>].</dd>
    <dt><dfn title="rdf-predicate" id="dfn-rdf-predicate">RDF predicate</dfn></dt>
    <dd>A <a class="tref externalDFN" title="predicate" href="http://www.w3.org/TR/rdf11-concepts/#dfn-predicate">predicate</a>
      as specified by [<cite><a class="bibref" href="#bib-RDF11-CONCEPTS">RDF11-CONCEPTS</a></cite>].</dd>
    <dt><dfn title="rdf-object" id="dfn-rdf-object">RDF object</dfn></dt>
    <dd>An <a class="tref externalDFN" title="object" href="http://www.w3.org/TR/rdf11-concepts/#dfn-object">object</a>
      as specified by [<cite><a class="bibref" href="#bib-RDF11-CONCEPTS">RDF11-CONCEPTS</a></cite>].</dd>
    <dt><dfn title="rdf-triple" id="dfn-rdf-triple">RDF triple</dfn></dt>
    <dd>A <a class="tref externalDFN" title="triple" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-triple">triple</a>
      as specified by [<cite><a class="bibref" href="#bib-RDF11-CONCEPTS">RDF11-CONCEPTS</a></cite>].</dd>
    <dt><dfn title="rdf-dataset" id="dfn-rdf-dataset">RDF dataset</dfn></dt>
    <dd>A <a class="tref externalDFN" title="dataset" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-dataset">dataset</a>
      as specified by [<cite><a class="bibref" href="#bib-RDF11-CONCEPTS">RDF11-CONCEPTS</a></cite>] representing a collection of
      <a class="tref externalDFN" title="rdf-graphs" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-graph">RDF graphs</a>.</dd>
  </dl>
</section> <!-- end of Algorithm Terms section -->


<section id="context-processing-algorithms">
  <!--OddPage--><h2 aria-level="1" role="heading" id="h2_context-processing-algorithms"><span class="secno">6. </span>Context Processing Algorithms</h2>

  <section id="context-processing-algorithm">
    <h3 aria-level="2" role="heading" id="h3_context-processing-algorithm"><span class="secno">6.1 </span>Context Processing Algorithm</h3>

    <p>When processing a JSON-LD data structure, each processing rule is applied
      using information provided by the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>. This
      section describes how to produce an <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>.</p>

    <p>The <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> contains the active
      <dfn title="term-definition" id="dfn-term-definition">term definitions</dfn> which specify how
      properties and values have to be interpreted as well as the current <dfn title="base-iri" id="dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></dfn>,
      the <dfn title="vocabulary-mapping" id="dfn-vocabulary-mapping">vocabulary mapping</dfn> and the <dfn title="default-language" id="dfn-default-language">default language</dfn>. Each
      <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> consists of an <dfn title="iri-mapping" id="dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</dfn>, a boolean
      flag <dfn title="reverse-property" id="dfn-reverse-property">reverse property</dfn>, an optional <dfn title="type-mapping" id="dfn-type-mapping">type mapping</dfn>
      or <dfn title="language-mapping" id="dfn-language-mapping">language mapping</dfn>, and an optional  <dfn title="container-mapping" id="dfn-container-mapping">container mapping</dfn>.
      A <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> can not only be used to map a <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
      to an <abbr title="Internationalized Resource Identifier">IRI</abbr>, but also to map a <a class="tref internalDFN" title="term" href="#dfn-term">term</a> to a <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a>,
      in which case it is referred to as a <dfn title="keyword-alias" id="dfn-keyword-alias">keyword alias</dfn>.</p>

    <p>When processing, the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> is initialized
      without any <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definitions</a>,
      <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>, or <a class="tref internalDFN" title="default-language" href="#dfn-default-language">default language</a>.
      If a <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> is encountered during processing, a new
      <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> is created by cloning the existing
      <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>. Then the information from the
      <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> is merged into the new <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>.
      Given that <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local contexts</a> may contain
      references to remote contexts, this includes their retrieval.</p>

    <section class="informative">
      <h4 id="overview" aria-level="3" role="heading">Overview</h4><p><em>This section is non-normative.</em></p>

      <p>First we prepare a new <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> <i>result</i> by cloning
        the current <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>. Then we normalize the form of the passed
        <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> to an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.
        <a class="tref internalDFN" title="local-context" href="#dfn-local-context">Local contexts</a> may be in the form of a
        <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>, a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, or an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing
        a combination of the two. Finally we process each <a class="tref internalDFN" title="context" href="#dfn-context">context</a> contained
        in the <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> <a class="tref internalDFN" title="array" href="#dfn-array">array</a> as follows.</p>

      <p>If <a class="tref internalDFN" title="context" href="#dfn-context">context</a> is a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, it represents a reference to
        a remote context. We dereference the remote context and replace <a class="tref internalDFN" title="context" href="#dfn-context">context</a>
        with the value of the <code>@context</code> key of the top-level object in the
        retrieved JSON-LD document. If there's no such key, an invalid remote context has
        been detected. Otherwise, we process <a class="tref internalDFN" title="context" href="#dfn-context">context</a> by recursively using
        this algorithm ensuring that there is no cyclical reference.</p>

      <p>If <a class="tref internalDFN" title="context" href="#dfn-context">context</a> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>, we first update the
        <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a>, the <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>, and the
        <a class="tref internalDFN" title="default-language" href="#dfn-default-language">default language</a> by processing three specific keywords:
        <code>@base</code>, <code>@vocab</code>, and <code>@language</code>.
        These are handled before any other keys in the <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> because
        they affect how the other keys are processed. Please note that <code>@base</code> is
        ignored when processing remote contexts.</p>

      <p>Then, for every other key in <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>, we update
        the <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> in <i>result</i>. Since
        <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definitions</a> in a <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>
        may themselves contain <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> or
        <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact IRIs</a>, we may need to recurse.
        When doing so, we must ensure that there is no cyclical dependency,
        which is an error. After we have processed any
        <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> dependencies,
        we update the current <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>,
        which may be a <a class="tref internalDFN" title="keyword-alias" href="#dfn-keyword-alias">keyword alias</a>.</p>

      <p>Finally, we return <i>result</i> as the new <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>.</p>
    </section>

    <section>
      <h4 id="algorithm" aria-level="3" role="heading">Algorithm</h4>

      <p>This algorithm specifies how a new <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> is updated
        with a <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>. The algorithm takes three input variables:
        an <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, a <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>, and an  <a class="tref internalDFN" title="array" href="#dfn-array">array</a>
        <i>remote contexts</i> which is used to detect cyclical context inclusions.
        If <i>remote contexts</i> is not passed, it is initialized to an empty
        <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</p>

      <div class="issue atrisk"><div class="issue-title" aria-level="4" role="heading" id="h_issue_1"><a href="https://www.w3.org/2011/rdf-wg/wiki/JSON-LD_Features_at_Risk#10"><span>Feature at Risk 10</span></a>: Support for @base: null </div><div class="atrisk" id="at-risk-10">
        <p class="atrisk-head">Note: This feature is
          <a href="http://www.w3.org/2005/10/Process-20051014/tr#cfi">"at risk"</a> and may
          be removed from this specification based on feedback. Please send feedback to
          <a href="mailto:public-rdf-comments@w3.org">public-rdf-comments@w3.org</a>.
          For the current status see
          <a href="http://www.w3.org/2011/rdf-wg/wiki/JSON-LD_Features_at_Risk">features "at risk" in JSON-LD 1.0</a></p>
       <p>Unlike many other serialization formats, JSON-LD allows to specify that
        there is no base <abbr title="Internationalized Resource Identifier">IRI</abbr> from within the document (by setting <code>@base</code> to
        <a class="tref internalDFN" title="null" href="#dfn-null">null</a>). The result is that the algorithm for establishing a base <abbr title="Internationalized Resource Identifier">IRI</abbr>
        as specified in <a href="http://tools.ietf.org/html/rfc3986#section-5.1">RFC3986 section 5.1</a>
        is overridden so relative IRIs remain relative IRIs even in the case that an <abbr title="Internationalized Resource Identifier">IRI</abbr>
        would be available in one of the outer layers (e.g., the <abbr title="Internationalized Resource Identifier">IRI</abbr> used to retrieve
        the document or an application supplied base <abbr title="Internationalized Resource Identifier">IRI</abbr>). Based on implementer feedback,
        the Working Group may decide to remove this feature from JSON-LD 1.0.</p>
      </div></div>

      <ol class="algorithm">
        <li>Initialize <i>result</i> to the result of cloning
          <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>.</li>
        <li>If <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>,
          set it to an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing only
          <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>.</li>
        <li>
          For each item <i>context</i> in <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>:
          <ol class="algorithm">
            <li>If <i>context</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set <i>result</i> to a
              newly-initialized <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> and continue with the
              next <i>context</i>. The <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a> of the
              <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> is set to the <abbr title="Internationalized Resource Identifier">IRI</abbr> of the currently being processed
              document (which might be different from the currently being processed context),
              if available; otherwise to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>. If set, the
              <code class="idlMemberName"><a href="#widl-JsonLdOptions-base">base</a></code>
              option of a <a class="tref internalDFN" title="json-ld-api-implementation" href="#dfn-json-ld-api-implementation">JSON-LD API Implementation</a> overrides the <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</li>
            <li>If <i>context</i> is a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>,
              <ol class="algorithm">
                <li>Set <i>context</i> to the result of resolving <i>value</i> against
                  the base <abbr title="Internationalized Resource Identifier">IRI</abbr> which is established as specified in
                  <cite><a href="http://tools.ietf.org/html/rfc3986#section-5.1">section 5.1 Establishing a Base URI</a></cite>
                  of [<cite><a class="bibref" href="#bib-RFC3986">RFC3986</a></cite>]. Only the basic algorithm in
                  <cite><a href="http://tools.ietf.org/html/rfc3986#section-5.2">section 5.2</a></cite>
                  of [<cite><a class="bibref" href="#bib-RFC3986">RFC3986</a></cite>] is used; neither
                  <cite><a href="http://tools.ietf.org/html/rfc3986#section-6.2.2">Syntax-Based Normalization</a></cite> nor
                  <cite><a href="http://tools.ietf.org/html/rfc3986#section-6.2.3">Scheme-Based Normalization</a></cite>
                  are performed. Characters additionally allowed in <abbr title="Internationalized Resource Identifier">IRI</abbr>
                  references are treated in the same way that unreserved
                  characters are treated in URI references, per
                  <cite><a href="http://tools.ietf.org/html/rfc3987#section-6.5">section 6.5</a></cite>
                  of [<cite><a class="bibref" href="#bib-RFC3987">RFC3987</a></cite>].</li>
                <li>If <i>context</i> is in the <i>remote contexts</i> array, a
                  <code class="error"><a href="#idl-def-JsonLdErrorCode.recursive-context-inclusion">recursive context inclusion</a></code>
                  error has been detected and processing is aborted;
                  otherwise, add <i>context</i> to <i>remote contexts</i>.</li>
                <li>Dereference <i>context</i>. If <i>context</i> cannot be dereferenced, a
                  <code class="error"><a href="#idl-def-JsonLdErrorCode.loading-remote-context-failed">loading remote context failed</a></code>
                  error has been detected and processing is aborted. If the dereferenced document has no
                  top-level <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> with an <code>@context</code> member, an
                  <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-remote-context">invalid remote context</a></code>
                  has been detected and processing is aborted; otherwise,
                  set <i>context</i> to the value of that member.</li>
                <li>Set <i>result</i> to the result of recursively calling this algorithm,
                  passing <i>result</i> for <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
                  <i>context</i> for <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>, and <i>remote contexts</i>.</li>
                <li>Continue with the next <i>context</i>.</li>
              </ol>
            </li>
            <li>If <i>context</i> is not a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>, an
              <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-local-context">invalid local context</a></code>
              error has been detected and processing is aborted.</li>
            <li>If <i>context</i> has an <code>@base</code> key and <i>remote contexts</i> is empty, i.e., the currently
              being processed context is not a remote context:
              <ol class="algorithm">
                <li>Initialize <i>value</i> to the value associated with the
                  <code>@base</code> key.</li>
                <li>If <i>value</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, remove the
                  <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a> of <i>result</i>.</li>
                <li>Otherwise, if <i>value</i> is an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a>,
                  the <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a> of <i>result</i> is set to <i>value</i>.</li>
                <li>Otherwise, if <i>value</i> is a <a class="tref internalDFN" title="relative-iri" href="#dfn-relative-iri">relative <abbr title="Internationalized Resource Identifier">IRI</abbr></a> and
                  the <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a> of <i>result</i> is not <a class="tref internalDFN" title="null" href="#dfn-null">null</a>,
                  set the <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a> of <i>result</i> to the result of
                  resolving <i>value</i> against the current <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
                  of <i>result</i>.</li>
                <li>Otherwise, an
                  <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-base-IRI">invalid base <abbr title="Internationalized Resource Identifier">IRI</abbr></a></code>
                  error has been detected and processing is aborted.</li>
              </ol>
            </li>
            <li>If <i>context</i> has an <code>@vocab</code> key:
              <ol class="algorithm">
                <li>Initialize <i>value</i> to the value associated with the
                  <code>@vocab</code> key.</li>
                <li>If <i>value</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, remove
                  any <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a> from <i>result</i>.</li>
                <li>Otherwise, if <i>value</i> is an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
                  or <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>, the <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>
                  of <i>result</i> is set to <i>value</i>. If it is not an
                  <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a> or <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>, an
                  <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-vocab-mapping">invalid vocab mapping</a></code>
                  error has been detected and processing is aborted.</li>
              </ol>
            </li>
            <li>If <i>context</i> has an <code>@language</code> key:
              <ol class="algorithm">
                <li>Initialize <i>value</i> to the value associated with the
                  <code>@language</code> key.</li>
                <li>If <i>value</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, remove
                  any <a class="tref internalDFN" title="default-language" href="#dfn-default-language">default language</a> from <i>result</i>.</li>
                <li>Otherwise, if <i>value</i> is <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, the
                  <a class="tref internalDFN" title="default-language" href="#dfn-default-language">default language</a> of <i>result</i> is set to
                  lowercased <i>value</i>. If it is not a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, an
                  <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-default-language">invalid default language</a></code>
                  error has been detected and processing is aborted.</li>
              </ol>
            </li>
            <li>Create a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> <i>defined</i> to use to keep
              track of whether or not a <a class="tref internalDFN" title="term" href="#dfn-term">term</a> has already been defined
              or currently being defined during recursion.</li>
            <li>For each <i>key</i>-<i>value</i> pair in <i>context</i> where
              <i>key</i> is not <code>@base</code>, <code>@vocab</code>, or
              <code>@language</code>, invoke the
              <a href="#create-term-definition">Create Term Definition algorithm</a>,
              passing <i>result</i> for <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
              <i>context</i> for <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>, <i>key</i>,
              and <i>defined</i>.</li>
          </ol>
        </li>
        <li>Return <i>result</i>.</li>
      </ol>
    </section>
  </section> <!-- end of Context Processing -->

  <section id="create-term-definition">
    <h3 aria-level="2" role="heading" id="h3_create-term-definition"><span class="secno">6.2 </span>Create Term Definition</h3>

    <p>This algorithm is called from the
      <a href="#context-processing-algorithm">Context Processing algorithm</a>
      to create a <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> in the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>
      for a <a class="tref internalDFN" title="term" href="#dfn-term">term</a> being processed in a <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>.</p>

    <section class="informative">
      <h4 id="overview-1" aria-level="3" role="heading">Overview</h4><p><em>This section is non-normative.</em></p>

      <p><a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">Term definitions</a> are created by
        parsing the information in the given <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> for the
        given <a class="tref internalDFN" title="term" href="#dfn-term">term</a>. If the given <a class="tref internalDFN" title="term" href="#dfn-term">term</a> is a
        <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact <abbr title="Internationalized Resource Identifier">IRI</abbr></a>, it may omit an <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a> by
        depending on its <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a> having its own
        <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>. If the <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a> is
        a key in the <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>, then its <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>
        must first be created, through recursion, before continuing. Because a
        <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> can depend on other
        <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definitions</a>, a mechanism must
        be used to detect cyclical dependencies. The solution employed here
        uses a map, <i>defined</i>, that keeps track of whether or not a
        <a class="tref internalDFN" title="term" href="#dfn-term">term</a> has been defined or is currently in the process of
        being defined. This map is checked before any recursion is attempted.</p>

      <p>After all dependencies for a <a class="tref internalDFN" title="term" href="#dfn-term">term</a> have been defined, the rest of
        the information in the <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> for the given
        <a class="tref internalDFN" title="term" href="#dfn-term">term</a> is taken into account, creating the appropriate
        <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a>, <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a>, and
        <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> for the
        <a class="tref internalDFN" title="term" href="#dfn-term">term</a>.</p>
    </section>

    <section>
      <h4 id="algorithm-1" aria-level="3" role="heading">Algorithm</h4>

      <p>The algorithm has four required inputs which are:
        an <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, a <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>,
        a <i>term</i>, and a map <i>defined</i>.</p>

      <ol class="algorithm">
        <li>If <i>defined</i> contains the key <i>term</i> and the associated
          value is <a class="tref internalDFN" title="true" href="#dfn-true">true</a> (indicating that the
          <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> has already been created), return. Otherwise,
          if the value is <a class="tref internalDFN" title="false" href="#dfn-false">false</a>, a
          <code class="error"><a href="#idl-def-JsonLdErrorCode.cyclic-IRI-mapping">cyclic <abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a></code>
          error has been detected and processing is aborted.</li>
        <li>Set the value associated with <i>defined</i>'s <i>term</i> key to
          <a class="tref internalDFN" title="false" href="#dfn-false">false</a>. This indicates that the <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>
          is now being created but is not yet complete.</li>
        <li>Since <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keywords</a> cannot be overridden,
          <i>term</i> must not be a <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a>. Otherwise, a
          <code class="error"><a href="#idl-def-JsonLdErrorCode.keyword-redefinition">keyword redefinition</a></code>
          error has been detected and processing is aborted.</li>
        <li>Remove any existing <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> for <i>term</i> in
          <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>.</li>
        <li>Initialize <i>value</i> to a copy of the value associated with the key
          <i>term</i> in <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>.</li>
        <li>If <i>value</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a> or <i>value</i>
          is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> containing the key-value pair
          <code>@id</code>-<a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set the
          <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> in <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> to
          <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set the value associated with <i>defined</i>'s
          key <i>term</i> to <a class="tref internalDFN" title="true" href="#dfn-true">true</a>, and return.</li>
        <li>Otherwise, if <i>value</i> is a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, convert it
          to a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> consisting of a single member whose
          key is <code>@id</code> and whose value is <i>value</i>.</li>
        <li>Otherwise, <i>value</i> must be a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>, if not, an
          <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-term-definition">invalid term definition</a></code>
          error has been detected and processing is aborted.</li>
        <li>Create a new <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>, <i>definition</i>.</li>
        <li>If <i>value</i> contains the key <code>@type</code>:
          <ol class="algorithm">
            <li>Initialize <i>type</i> to the value associated with the
              <code>@type</code> key, which must be a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>. Otherwise, an
              <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-type-mapping">invalid type mapping</a></code>
              error has been detected and processing is aborted.</li>
            <li>Set <i>type</i> to the result of using the
              <a href="#iri-expansion"><abbr title="Internationalized Resource Identifier">IRI</abbr> Expansion algorithm</a>, passing
              <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <i>type</i> for <i>value</i>,
              <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i>,
              <a class="tref internalDFN" title="false" href="#dfn-false">false</a> for <i>document relative</i>,
              <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>, and <i>defined</i>. If the expanded <i>type</i> is
              neither <code>@id</code>, nor <code>@vocab</code>, nor an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a>, an
              <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-type-mapping">invalid type mapping</a></code>
              error has been detected and processing is aborted.</li>
            <li>Set the <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> for <i>definition</i> to <i>type</i>.</li>
          </ol>
        </li>
        <li>If <i>value</i> contains the key <code>@reverse</code>:
          <ol class="algorithm">
            <li>If <i>value</i> contains an <code>@id</code>, member, an
              <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-reverse-property">invalid reverse property</a></code>
              error has been detected and processing is aborted.</li>
            <li>If the value associated with the <code>@reverse</code> key
              is not a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, an
              <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-IRI-mapping">invalid <abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a></code>
              error has been detected and processing is aborted.</li>
            <li>Otherwise, set the <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a> of <i>definition</i> to the
              result of using the <a href="#iri-expansion"><abbr title="Internationalized Resource Identifier">IRI</abbr> Expansion algorithm</a>,
              passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, the value associated with
              the <code>@reverse</code> key for <i>value</i>, <a class="tref internalDFN" title="true" href="#dfn-true">true</a>
              for <i>vocab</i>, <a class="tref internalDFN" title="false" href="#dfn-false">false</a> for <i>document relative</i>,
              <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>, and <i>defined</i>. If the result
              is neither an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a> nor a <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>,
              i.e., it contains no colon (<code>:</code>), an
              <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-IRI-mapping">invalid <abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a></code>
              error has been detected and processing is aborted.</li>
            <li>If <i>value</i> contains an <code>@container</code> member,
              set the <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> of <i>definition</i>
              to its value; if its value is neither <code>@set</code>, nor
              <code>@index</code>, nor <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, an
              <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-reverse-property">invalid reverse property</a></code>
              error has been detected (reverse properties only support set- and
              index-containers) and processing is aborted.</li>
            <li>Set the <a class="tref internalDFN" title="reverse-property" href="#dfn-reverse-property">reverse property</a> flag of <i>definition</i>
              to <a class="tref internalDFN" title="true" href="#dfn-true">true</a>.</li>
            <li>Set the <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> of <i>term</i> in
              <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> to <i>definition</i> and the
              value associated with <i>defined</i>'s key <i>term</i> to
              <a class="tref internalDFN" title="true" href="#dfn-true">true</a> and return.</li>
          </ol>
        </li>
        <li>Set the <a class="tref internalDFN" title="reverse-property" href="#dfn-reverse-property">reverse property</a> flag of <i>definition</i>
          to <a class="tref internalDFN" title="false" href="#dfn-false">false</a>.</li>
        <li>If <i>value</i> contains the key <code>@id</code> and its value
          does not equal <i>term</i>:
          <ol class="algorithm">
            <li>If the value associated with the <code>@id</code> key is not a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, an
              <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-IRI-mapping">invalid <abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a></code>
              error has been detected and processing is aborted.</li>
            <li>Otherwise, set the <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a> of <i>definition</i> to the
              result of using the <a href="#iri-expansion"><abbr title="Internationalized Resource Identifier">IRI</abbr> Expansion algorithm</a>, passing
              <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, the value associated with the <code>@id</code> key for
              <i>value</i>, <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i>,
              <a class="tref internalDFN" title="false" href="#dfn-false">false</a> for <i>document relative</i>,
              <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>, and <i>defined</i>. If the resulting
              <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a> is neither a <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a>, nor an
              <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a>, nor a <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>, an
              <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-IRI-mapping">invalid <abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a></code>
              error has been detected and processing is aborted; if it equals <code>@context</code>, an
              <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-keyword-alias">invalid keyword alias</a></code>
              error has been detected and processing is aborted.</li>
          </ol>
        </li>
        <li>
          Otherwise if the <i>term</i> contains a colon (<code>:</code>):
          <ol class="algorithm">
            <li>If <i>term</i> is a <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact <abbr title="Internationalized Resource Identifier">IRI</abbr></a> with a
              <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a> that is a key in <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>
              a dependency has been found. Use this algorithm recursively passing
              <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>, the
              <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a> as <i>term</i>, and <i>defined</i>.</li>
            <li>If <i>term</i>'s <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a> has a
              <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> in <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, set
              the <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a> of <i>definition</i> to the result of
              concatenating the value associated with the <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a>'s
              <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a> and the <i>term</i>'s <i>suffix</i>.</li>
            <li>Otherwise, <i>term</i> is an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a> or
              <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>. Set the <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a>
              of <i>definition</i> to <i>term</i>.</li>
          </ol>
        </li>
        <li>Otherwise, if <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> has a
          <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>, the <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a>
          of <i>definition</i> is set to the result of concatenating the value
          associated with the <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a> and <i>term</i>.
          If it does not have a <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>, an
          <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-IRI-mapping">invalid <abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a></code>
          error been detected and processing is aborted.</li>
        <li>If <i>value</i> contains the key <code>@container</code>:
          <ol class="algorithm">
            <li>Initialize <i>container</i> to the value associated with the
              <code>@container</code> key, which must be either
              <code>@list</code>, <code>@set</code>, <code>@index</code>,
              or <code>@language</code>. Otherwise, an
              <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-container-mapping">invalid container mapping</a></code> error
              has been detected and processing is aborted.</li>
            <li>Set the <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> of <i>definition</i> to
              <i>container</i>.</li>
          </ol>
        </li>
        <li>If <i>value</i> contains the key <code>@language</code> and
          does not contain the key <code>@type</code>:
          <ol class="algorithm">
            <li>Initialize <i>language</i> to the value associated with the
              <code>@language</code> key, which must be either <a class="tref internalDFN" title="null" href="#dfn-null">null</a>
              or a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>. Otherwise, an
              <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-language-mapping">invalid language mapping</a></code>
              error has been detected and processing is aborted.</li>
            <li>If <i>language</i> is a <a class="tref internalDFN" title="string" href="#dfn-string">string</a> set it to
              lowercased <i>language</i>. Set the <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a>
              of <i>definition</i> to <i>language</i>.</li>
          </ol>
        </li>
        <li>Set the <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> of <i>term</i> in
          <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> to <i>definition</i> and set the value
          associated with <i>defined</i>'s key <i>term</i> to
          <a class="tref internalDFN" title="true" href="#dfn-true">true</a>.</li>
      </ol>
    </section>
  </section> <!-- end of Term Creation -->

  <section id="iri-expansion">
    <h3 aria-level="2" role="heading" id="h3_iri-expansion"><span class="secno">6.3 </span><abbr title="Internationalized Resource Identifier">IRI</abbr> Expansion</h3>

    <p>In JSON-LD documents, some keys and values may represent
      <a class="tref internalDFN" title="iri" href="#dfn-iri">IRIs</a>. This section defines an algorithm for
      transforming a <a class="tref internalDFN" title="string" href="#dfn-string">string</a> that represents an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> into
      an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a> or <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>.
      It also covers transforming <a class="tref internalDFN" title="keyword-alias" href="#dfn-keyword-alias">keyword aliases</a>
      into <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keywords</a>.</p>

    <p><a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> expansion may occur during context processing or during
      any of the other JSON-LD algorithms. If <abbr title="Internationalized Resource Identifier">IRI</abbr> expansion occurs during context
      processing, then the <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> and its related <i>defined</i>
      map from the <a href="#context-processing-algorithm">Context Processing algorithm</a>
      are passed to this algorithm. This allows for <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>
      dependencies to be processed via the
      <a href="#create-term-definition">Create Term Definition algorithm</a>.</p>

    <section class="informative">
      <h4 id="overview-2" aria-level="3" role="heading">Overview</h4><p><em>This section is non-normative.</em></p>

      <p>In order to expand <i>value</i> to an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a>, we must
        first determine if it is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, a <a class="tref internalDFN" title="term" href="#dfn-term">term</a>, a
        <a class="tref internalDFN" title="keyword-alias" href="#dfn-keyword-alias">keyword alias</a>, or some form of <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>. Based on what
        we find, we handle the specific kind of expansion; for example, we expand
        a <a class="tref internalDFN" title="keyword-alias" href="#dfn-keyword-alias">keyword alias</a> to a <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a> and a <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
        to an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a> according to its <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a>
        in the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>. While inspecting <i>value</i> we
        may also find that we need to create <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>
        dependencies because we're running this algorithm during context processing.
        We can tell whether or not we're running during context processing by
        checking <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> against <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.
        We know we need to create a <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> in the
        <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> when <i>value</i> is
        a key in the <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> and the <i>defined</i> map
        does not have a key for <i>value</i> with an associated value of
        <a class="tref internalDFN" title="true" href="#dfn-true">true</a>. The <i>defined</i> map is used during
        <a href="#context-processing-algorithm">Context Processing</a> to keep track of
        which <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> have already been defined or are
        in the process of being defined. We create a
        <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> by using the
        <a href="#create-term-definition">Create Term Definition algorithm</a>.</p>
    </section>

    <section>
      <h4 id="algorithm-2" aria-level="3" role="heading">Algorithm</h4>

      <p>The algorithm takes two required and four optional input variables. The
        required inputs are an <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> and a <i>value</i>
        to be expanded. The optional inputs are two flags,
        <i>document relative</i> and <i>vocab</i>, that specifying
        whether <i>value</i> can be interpreted as a <a class="tref internalDFN" title="relative-iri" href="#dfn-relative-iri">relative <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
        against the document's base <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> or the
        <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context's</a>
        <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>, respectively, and
        a <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> and a map <i>defined</i> to be used when
        this algorithm is used during <a href="#context-processing-algorithm">Context Processing</a>.
        If not passed, the two flags are set to <code>false</code> and
        <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> and <i>defined</i> are initialized to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</p>

      <ol class="algorithm">
        <li>If <i>value</i> is a <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a> or <a class="tref internalDFN" title="null" href="#dfn-null">null</a>,
          return <i>value</i> as is.</li>
        <li>If <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> is not <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, it contains
          a key that equals <i>value</i>, and the value associated with the key
          that equals <i>value</i> in <i>defined</i> is not <a class="tref internalDFN" title="true" href="#dfn-true">true</a>,
          invoke the <a href="#create-term-definition">Create Term Definition algorithm</a>,
          passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>,
          <i>value</i> as <i>term</i>, and <i>defined</i>. This will ensure that
          a <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> is created for <i>value</i> in
          <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> during <a href="#context-processing-algorithm">Context Processing</a>.
        </li>
        <li>If <i>vocab</i> is <a class="tref internalDFN" title="true" href="#dfn-true">true</a> and the
          <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> has a <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> for
          <i>value</i>, return the associated <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a>.</li>
        <li>If <i>value</i> contains a colon (<code>:</code>), it is either
          an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a>, a <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact <abbr title="Internationalized Resource Identifier">IRI</abbr></a>, or a
          <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>:
          <ol class="algorithm">
            <li>Split <i>value</i> into a <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a> and <i>suffix</i>
              at the first occurrence of a colon (<code>:</code>).</li>
            <li>If <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a> is underscore (<code>_</code>)
              or <i>suffix</i> begins with double-forward-slash
              (<code>//</code>), return <i>value</i> as it is already an
              <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a> or a <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>.</li>
            <li>If <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> is not <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, it
              contains a key that equals <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a>, and the value
              associated with the key that equals <i>prefix</i> in <i>defined</i>
              is not <a class="tref internalDFN" title="true" href="#dfn-true">true</a>, invoke the
              <a href="#create-term-definition">Create Term Definition algorithm</a>,
              passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
              <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>, <i>prefix</i> as <i>term</i>,
              and <i>defined</i>. This will ensure that a
              <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> is created for <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a>
              in <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> during
              <a href="#context-processing-algorithm">Context Processing</a>.</li>
            <li>If <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> contains a <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>
              for <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a>, return the result of concatenating
              the <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a> associated with <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a> and
              <i>suffix</i>.</li>
            <li>Return <i>value</i> as it is already an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</li>
          </ol>
        </li>
        <li>If <i>vocab</i> is <a class="tref internalDFN" title="true" href="#dfn-true">true</a>, and
          <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> has a <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>,
          return the result of concatenating the <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>
          with <i>value</i>.</li>
        <li>Otherwise, if <i>document relative</i> is <a class="tref internalDFN" title="true" href="#dfn-true">true</a>,
          set <i>value</i> to the result of resolving <i>value</i> against
          the <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a>. Only the basic algorithm in
          <cite><a href="http://tools.ietf.org/html/rfc3986#section-5.2">section 5.2</a></cite>
          of [<cite><a class="bibref" href="#bib-RFC3986">RFC3986</a></cite>] is used; neither
          <cite><a href="http://tools.ietf.org/html/rfc3986#section-6.2.2">Syntax-Based Normalization</a></cite> nor
          <cite><a href="http://tools.ietf.org/html/rfc3986#section-6.2.3">Scheme-Based Normalization</a></cite>
          are performed. Characters additionally allowed in <abbr title="Internationalized Resource Identifier">IRI</abbr> references are treated
          in the same way that unreserved characters are treated in URI references, per
          <cite><a href="http://tools.ietf.org/html/rfc3987#section-6.5">section 6.5</a></cite>
          of [<cite><a class="bibref" href="#bib-RFC3987">RFC3987</a></cite>].</li>
        <li>Return <i>value</i> as is.</li>
      </ol>
    </section>
  </section> <!-- end of IRI Expansion -->
</section> <!-- end of Context Processing section -->


<section id="expansion-algorithms">
  <!--OddPage--><h2 aria-level="1" role="heading" id="h2_expansion-algorithms"><span class="secno">7. </span>Expansion Algorithms</h2>

  <section id="expansion-algorithm">
    <h3 aria-level="2" role="heading" id="h3_expansion-algorithm"><span class="secno">7.1 </span>Expansion Algorithm</h3>

    <p>This algorithm expands a JSON-LD document, such that all <a class="tref internalDFN" title="context" href="#dfn-context">context</a>
      definitions are removed, all <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> and
      <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact IRIs</a> are expanded to
      <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute IRIs</a>,
      <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a>, or
      <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keywords</a> and all
      <a class="tref internalDFN" title="json-ld-value" href="#dfn-json-ld-value">JSON-LD values</a> are expressed in
      <a class="tref internalDFN" title="array" href="#dfn-array">arrays</a> in <a class="tref internalDFN" title="expanded-form" href="#dfn-expanded-form">expanded form</a>.</p>

    <section class="informative">
      <h4 id="overview-3" aria-level="3" role="heading">Overview</h4><p><em>This section is non-normative.</em></p>

      <p>Starting with its root <i>element</i>, we can process the
        JSON-LD document recursively, until we have a fully
        <a class="tref internalDFN" title="expansion" href="#dfn-expansion">expanded</a> <i>result</i>. When
        <a class="tref internalDFN" title="expansion" href="#dfn-expansion">expanding</a> an <i>element</i>, we can treat
        each one differently according to its type, in order to break down the
        problem:</p>

      <ol>
        <li>If the <i>element</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, there is nothing
          to expand.</li>
        <li>Otherwise, if <i>element</i> is a <a class="tref internalDFN" title="scalar" href="#dfn-scalar">scalar</a>, we expand it
          according to the <a href="#value-expansion">Value Expansion algorithm</a>.</li>
        <li>Otherwise, if the <i>element</i> is an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, then we expand
          each of its items recursively and return them in a new
          <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
        <li>Otherwise, <i>element</i> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>. We expand
          each of its keys, adding them to our <i>result</i>, and then we expand
          each value for each key recursively. Some of the keys will be
          <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> or
          <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact IRIs</a> and others will be
          <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keywords</a> or simply ignored because
          they do not have definitions in the <a class="tref internalDFN" title="context" href="#dfn-context">context</a>. Any
          <a class="tref internalDFN" title="iri" href="#dfn-iri">IRIs</a> will be expanded using the
          <a href="#iri-expansion"><abbr title="Internationalized Resource Identifier">IRI</abbr> Expansion algorithm</a>.
        </li>
      </ol>

      <p>Finally, after ensuring <i>result</i> is in an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>,
        we return <i>result</i>.</p>
    </section>

    <section>
      <h4 id="algorithm-3" aria-level="3" role="heading">Algorithm</h4>

      <p>The algorithm takes three input variables: an <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
        an <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and an <i>element</i> to be expanded.
        To begin, the <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> is set to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>,
        and <i>element</i> is set to the <a class="tref internalDFN" title="json-ld-input" href="#dfn-json-ld-input">JSON-LD input</a>.</p>

      <ol class="algorithm">
        <li>If <i>element</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, return <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</li>
        <li>If <i>element</i> is a <a class="tref internalDFN" title="scalar" href="#dfn-scalar">scalar</a>,
          <ol class="algorithm">
            <li>If <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a> or <code>@graph</code>,
              drop the free-floating <a class="tref internalDFN" title="scalar" href="#dfn-scalar">scalar</a> by returning <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</li>
            <li>Return the result of the
              <a href="#value-expansion">Value Expansion algorithm</a>, passing the
              <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and
              <i>element</i> as <i>value</i>.</li>
          </ol>
        </li>
        <li>If <i>element</i> is an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>,
          <ol class="algorithm">
            <li>Initialize an empty array, <i>result</i>.</li>
            <li>For each <i>item</i> in <i>element</i>:
              <ol class="algorithm">
                <li>Initialize <i>expanded item</i> to the result of using this
                  algorithm recursively, passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
                  <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and <i>item</i> as <i>element</i>.</li>
                <li>If the <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> is <code>@list</code> or its
                  <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> is set to <code>@list</code>, the
                  <i>expanded item</i> must not be an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> or a
                  <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a>, otherwise a
                  <code class="error"><a href="#idl-def-JsonLdErrorCode.list-of-lists">list of lists</a></code>
                  error has been detected and processing is aborted.</li>
                <li>If <i>expanded item</i> is an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, append each
                  of its items to <i>result</i>. Otherwise, if
                  <i>expanded item</i> is not null, append it to <i>result</i>.</li>
              </ol>
            </li>
            <li>Return <i>result</i>.</li>
          </ol>
        </li>
        <li>Otherwise <i>element</i> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>.</li>
        <li>If <i>element</i> contains the key <code>@context</code>, set
          <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> to the result of the
          <a href="#context-processing-algorithm">Context Processing algorithm</a>,
          passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> and the value of the
          <code>@context</code> key as <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>.</li>
        <li>Initialize an empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>, <i>result</i>.</li>
        <li>For each <i>key</i> and <i>value</i> in <i>element</i>,
          ordered lexicographically by <i>key</i>:
          <ol class="algorithm">
            <li>If <i>key</i> is <code>@context</code>, continue to
              the next <i>key</i>.</li>
            <li>Set <i>expanded property</i> to the result of
              using the <a href="#iri-expansion"><abbr title="Internationalized Resource Identifier">IRI</abbr> Expansion algorithm</a>,
              passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <i>key</i> for
              <i>value</i>, and <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i>.</li>
            <li>If <i>expanded property</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a> or it neither
              contains a colon (<code>:</code>) nor it is a <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a>,
              drop <i>key</i> by continuing to the next <i>key</i>.</li>
            <li>If <i>expanded property</i> is a <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a>:
              <ol class="algorithm">
                <li>If <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> equals <code>@reverse</code>, an
                  <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-reverse-property-map">invalid reverse property map</a></code>
                  error has been detected and processing is aborted.</li>
                <li>If <i>result</i> has already an <i>expanded property</i> member, an
                  <code class="error"><a href="#idl-def-JsonLdErrorCode.colliding-keywords">colliding keywords</a></code>
                  error has been detected and processing is aborted.</li>
                <li>If <i>expanded property</i> is <code>@id</code> and
                  <i>value</i> is not a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, an
                  <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid--id-value">invalid @id value</a></code>
                  error has been detected and processing is aborted. Otherwise,
                  set <i>expanded value</i> to the result of using the
                  <a href="#iri-expansion"><abbr title="Internationalized Resource Identifier">IRI</abbr> Expansion algorithm</a>,
                  passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <i>value</i>, and <a class="tref internalDFN" title="true" href="#dfn-true">true</a>
                  for <i>document relative</i>.</li>
                <li>If <i>expanded property</i> is <code>@type</code> and <i>value</i>
                  is neither a <a class="tref internalDFN" title="string" href="#dfn-string">string</a> nor an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> of
                  <a class="tref internalDFN" title="string" href="#dfn-string">strings</a>, an
                  <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-type-value">invalid type value</a></code>
                  error has been detected and processing is aborted. Otherwise,
                  set <i>expanded value</i> to the result of using the
                  <a href="#iri-expansion"><abbr title="Internationalized Resource Identifier">IRI</abbr> Expansion algorithm</a>, passing
                  <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i>,
                  and <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>document relative</i> to expand the <i>value</i>
                  or each of its items.</li>
                <li>If <i>expanded property</i> is <code>@graph</code>, set
                  <i>expanded value</i> to the result of using this algorithm
                  recursively passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <code>@graph</code>
                  for <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and <i>value</i> for <i>element</i>.</li>
                <li>If <i>expanded property</i> is <code>@value</code> and
                  <i>value</i> is not a <a class="tref internalDFN" title="scalar" href="#dfn-scalar">scalar</a> or <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, an
                  <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-value-object-value">invalid value object value</a></code>
                  error has been detected and processing is aborted. Otherwise,
                  set <i>expanded value</i> to <i>value</i>. If <i>expanded value</i>
                  is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set the <code>@value</code>
                  member of <i>result</i> to <a class="tref internalDFN" title="null" href="#dfn-null">null</a> and continue with the
                  next <i>key</i> from <i>element</i>. Null values need to be preserved
                  in this case as the meaning of an <code>@type</code> member depends
                  on the existence of an <code>@value</code> member.</li>
                <li>If <i>expanded property</i> is <code>@language</code> and
                  <i>value</i> is not a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, an
                  <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-language-tagged-string">invalid language-tagged string</a></code>
                  error has been detected and processing is aborted. Otherwise,
                  set <i>expanded value</i> to lowercased <i>value</i>.</li>
                <li>If <i>expanded property</i> is <code>@index</code> and
                  <i>value</i> is not a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, an
                  <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid--index-value">invalid @index value</a></code>
                  error has been detected and processing is aborted. Otherwise,
                  set <i>expanded value</i> to <i>value</i>.</li>
                <li>If <i>expanded property</i> is <code>@list</code>:
                  <ol class="algorithm">
                    <li>If <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a> or
                      <code>@graph</code>, continue with the next <i>key</i>
                      from <i>element</i> to remove the free-floating list.</li>
                    <li>Otherwise, initialize <i>expanded value</i> to the result of using
                      this algorithm recursively passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
                      <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and <i>value</i> for <i>element</i>.</li>
                    <li>If <i>expanded value</i> is a <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a>, a
                      <code class="error"><a href="#idl-def-JsonLdErrorCode.list-of-lists">list of lists</a></code>
                      error has been detected and processing is aborted.</li>
                  </ol>
                </li>
                <li>If <i>expanded property</i> is <code>@set</code>, set
                  <i>expanded value</i> to the result of using this algorithm
                  recursively, passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
                  <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and <i>value</i> for
                  <i>element</i>.</li>
                <li>If <i>expanded property</i> is <code>@reverse</code> and
                  <i>value</i> is not a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>, an
                  <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid--reverse-value">invalid @reverse value</a></code>
                  error has been detected and processing is aborted. Otherwise
                  <ol class="algorithm">
                    <li>Initialize <i>expanded value</i> to the result of using this
                      algorithm recursively, passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
                      <code>@reverse</code> as <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and
                      <i>value</i> as <i>element</i>.</li>
                    <li>If <i>expanded value</i> contains an <code>@reverse</code> member,
                      i.e., properties that are reversed twice, execute for each of its
                      <i>property</i> and <i>item</i> the following steps:
                      <ol class="algorithm">
                        <li>If <i>result</i> does not have a <i>property</i> member, create
                          one and set its value to an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
                        <li>Append <i>item</i> to the value of the <i>property</i> member
                          of <i>result</i>.</li>
                      </ol>
                    </li>
                    <li>If <i>expanded value</i> contains members other than <code>@reverse</code>:
                      <ol class="algorithm">
                        <li>If <i>result</i> does not have an <code>@reverse</code> member, create
                          one and set its value to an empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>.</li>
                        <li>Reference the value of the <code>@reverse</code> member in <i>result</i>
                          using the variable <i>reverse map</i>.</li>
                        <li>For each <i>property</i> and <i>items</i> in <i>expanded value</i>
                          other than <code>@reverse</code>:
                          <ol class="algorithm">
                            <li>For each <i>item</i> in <i>items</i>:
                              <ol class="algorithm">
                                <li>If <i>item</i> is a <a class="tref internalDFN" title="value-object" href="#dfn-value-object">value object</a> or <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a>, an
                                  <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid--reverse-value">invalid reverse property value</a></code>
                                  has been detected and processing is aborted.</li>
                                <li>If <i>reverse map</i> has no <i>property</i> member, create one
                                  and initialize its value to an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
                                <li>Append <i>item</i> to the value of the <i>property</i>
                                  member in <i>reverse map</i>.</li>
                              </ol>
                            </li>
                          </ol>
                        </li>
                      </ol>
                    </li>
                    <li>Continue with the next <i>key</i> from <i>element</i>.</li>
                  </ol>
                </li>
                <li>Unless <i>expanded value</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set
                  the <i>expanded property</i> member of <i>result</i> to
                  <i>expanded value</i>.</li>
                <li>Continue with the next <i>key</i> from <i>element</i>.</li>
              </ol>
            </li>
            <li>Otherwise, if <i>key</i>'s <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> in
              <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> is <code>@language</code> and
              <i>value</i> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> then <i>value</i>
              is expanded from a <a class="tref externalDFN" title="language-map" href="http://www.w3.org/TR/2013/CR-json-ld-20130910/#dfn-language-map">language map</a>
              as follows:
              <ol class="algorithm">
                <li>Initialize <i>expanded value</i> to an empty
                  <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
                <li>For each key-value pair <i>language</i>-<i>language value</i>
                  in <i>value</i>, ordered lexicographically by <i>language</i>:
                  <ol class="algorithm">
                    <li>If <i>language value</i> is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>
                      set it to an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing only
                      <i>language value</i>.</li>
                    <li>For each <i>item</i> in <i>language value</i>:
                      <ol class="algorithm">
                        <li><i>item</i> must be a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>,
                          otherwise an
                          <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-language-map-value">invalid language map value</a></code>
                          error has been detected and processing is aborted.</li>
                        <li>Append a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> to
                          <i>expanded value</i> that consists of two
                          key-value pairs: (<code>@value</code>-<i>item</i>)
                          and (<code>@language</code>-lowercased
                          <i>language</i>).</li>
                      </ol>
                    </li>
                  </ol>
                </li>
              </ol>
            </li>
            <li>Otherwise, if <i>key</i>'s <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> in
              <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> is <code>@index</code> and
              <i>value</i> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> then <i>value</i>
              is expanded from an index map as follows:
              <ol class="algorithm">
                <li>Initialize <i>expanded value</i> to an empty
                  <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
                <li>For each key-value pair <i>index</i>-<i>index value</i>
                  in <i>value</i>, ordered lexicographically by <i>index</i>:
                  <ol class="algorithm">
                    <li>If <i>index value</i> is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>
                      set it to an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing only
                      <i>index value</i>.</li>
                    <li>Initialize <i>index value</i> to the result of
                      using this algorithm recursively, passing
                      <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
                      <i>key</i> as <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>,
                      and <i>index value</i> as <i>element</i>.</li>
                    <li>For each <i>item</i> in <i>index value</i>:
                      <ol class="algorithm">
                        <li>If <i>item</i> does not have the key
                          <code>@index</code>, add the key-value pair
                          (<code>@index</code>-<i>index</i>) to
                          <i>item</i>.</li>
                        <li>Append <i>item</i> to <i>expanded value</i>.</li>
                      </ol>
                    </li>
                  </ol>
                </li>
              </ol>
            </li>
            <li>Otherwise, initialize <i>expanded value</i> to the result of
              using this algorithm recursively, passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
              <i>key</i> for <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and <i>value</i>
              for <i>element</i>.</li>
            <li>If <i>expanded value</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, ignore <i>key</i>
              by continuing to the next <i>key</i> from <i>element</i>.</li>
            <li>If the <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> associated to <i>key</i> in
              <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> is <code>@list</code> and
              <i>expanded value</i> is not already a <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a>,
              convert <i>expanded value</i> to a <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a>
              by first setting it to an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing only
              <i>expanded value</i> if it is not already an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>,
              and then by setting it to a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> containing
              the key-value pair <code>@list</code>-<i>expanded value</i>.</li>
            <li>Otherwise, if the <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> associated to
              <i>key</i> indicates that it is a <a class="tref internalDFN" title="reverse-property" href="#dfn-reverse-property">reverse property</a>
              <ol class="algorithm">
                <li>If <i>result</i> has no <code>@reverse</code> member, create
                  one and initialize its value to an empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>.</li>
                <li>Reference the value of the <code>@reverse</code> member in <i>result</i>
                  using the variable <i>reverse map</i>.</li>
                <li>If <i>expanded value</i> is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, set
                  it to an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing <i>expanded value</i>.</li>
                <li>For each <i>item</i> in <i>expanded value</i>
                  <ol class="algorithm">
                    <li>If <i>item</i> is a <a class="tref internalDFN" title="value-object" href="#dfn-value-object">value object</a> or <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a>, an
                      <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid--reverse-value">invalid reverse property value</a></code>
                      has been detected and processing is aborted.</li>
                    <li>If <i>reverse map</i> has no <i>expanded property</i> member,
                      create one and initialize its value to an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
                    <li>Append <i>item</i> to the value of the <i>expanded property</i>
                      member of <i>reverse map</i>.</li>
                  </ol>
                </li>
              </ol>
            </li>
            <li>Otherwise, if <i>key</i> is not a <a class="tref internalDFN" title="reverse-property" href="#dfn-reverse-property">reverse property</a>:
              <ol class="algorithm">
                <li>If <i>result</i> does not have an <i>expanded property</i>
                  member, create one and initialize its value to an empty
                  <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
                <li>Append <i>expanded value</i> to value of the <i>expanded property</i>
                  member of <i>result</i>.</li>
              </ol>
            </li>
          </ol>
        </li>
        <li>If <i>result</i> contains the key <code>@value</code>:
          <ol class="algorithm">
            <li>The <i>result</i> must not contain any keys other than
              <code>@value</code>, <code>@language</code>, <code>@type</code>,
              and <code>@index</code>. It must not contain both the
              <code>@language</code> key and the <code>@type</code> key.
              Otherwise, an
              <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-value-object">invalid value object</a></code>
              error has been detected and processing is aborted.</li>
            <li>If the value of <i>result</i>'s <code>@value</code> key is
              <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, then set <i>result</i> to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</li>
            <li>Otherwise, if the value of <i>result</i>'s <code>@value</code> member
              is not a <a class="tref internalDFN" title="string" href="#dfn-string">string</a> and <i>result</i> contains the key
              <code>@language</code>, an
              <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-language-tagged-value">invalid language-tagged value</a></code>
              error has been detected (only <a class="tref internalDFN" title="string" href="#dfn-string">strings</a>
              can be language-tagged) and processing is aborted.</li>
            <li>Otherwise, if the <i>result</i> has a <code>@type</code> member
              and its value is not an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>, an
              <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-typed-value">invalid typed value</a></code>
              error has been detected and processing is aborted.</li>
          </ol>
        </li>
        <li>Otherwise, if <i>result</i> contains the key <code>@type</code>
          and its associated value is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, set it to
          an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing only the associated value.</li>
        <li>Otherwise, if <i>result</i> contains the key <code>@set</code>
          or <code>@list</code>:
          <ol class="algorithm">
            <li>The <i>result</i> must contain at most one other key and that
              key must be <code>@index</code>. Otherwise, an
              <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-set-or-list-object">invalid set or list object</a></code>
              error has been detected and processing is aborted.</li>
            <li>If <i>result</i> contains the key <code>@set</code>, then
              set <i>result</i> to the key's associated value.</li>
          </ol>
        </li>
        <li>If <i>result</i> contains only the key
          <code>@language</code>, set <i>result</i> to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</li>
        <li>If <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a> or <code>@graph</code>,
          drop free-floating values as follows:
          <ol class="algorithm">
            <li>If <i>result</i> is an empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> or contains
              the keys <code>@value</code> or <code>@list</code>, set <i>result</i> to
              <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</li>
            <li>Otherwise, if <i>result</i> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> whose only
              key is <code>@id</code>, set <i>result</i> to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</li>
          </ol>
        </li>
        <li>Return <i>result</i>.</li>
      </ol>

      <p>If, after the above algorithm is run, the result is a
        <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> that contains only an <code>@graph</code> key, set the
        result to the value of <code>@graph</code>'s value. Otherwise, if the result
        is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set it to an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>. Finally, if
        the result is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, then set the result to an
        <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing only the result.</p>
    </section>
  </section> <!-- end of Expansion Algorithm -->


  <section id="value-expansion">
    <h3 aria-level="2" role="heading" id="h3_value-expansion"><span class="secno">7.2 </span>Value Expansion</h3>

    <p>Some values in JSON-LD can be expressed in a
      <a class="tref internalDFN" title="compacted-form" href="#dfn-compacted-form">compact form</a>. These values are required
      to be <a class="tref internalDFN" title="expansion" href="#dfn-expansion">expanded</a> at times when processing
      JSON-LD documents. A value is said to be in <dfn title="expanded-form" id="dfn-expanded-form">expanded form</dfn>
      after the application of this algorithm.</p>

    <section class="informative">
      <h4 id="overview-4" aria-level="3" role="heading">Overview</h4><p><em>This section is non-normative.</em></p>

      <p>If <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> has a <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> in the
        <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> set to <code>@id</code> or <code>@vocab</code>,
        a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> with a single member <code>@id</code> whose
        value is the result of using the
        <a href="#iri-expansion"><abbr title="Internationalized Resource Identifier">IRI</abbr> Expansion algorithm</a> on <i>value</i>
        is returned.</p>

      <p>Otherwise, the result will be a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> containing
        an <code>@value</code> member whose value is the passed <i>value</i>.
        Additionally, an <code>@type</code> member will be included if there is a
        <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> associated with the <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>
        or an <code>@language</code> member if <i>value</i> is a
        <a class="tref internalDFN" title="string" href="#dfn-string">string</a> and there is <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> associated
        with the <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>.</p>
    </section>

    <section>
      <h4 id="algorithm-4" aria-level="3" role="heading">Algorithm</h4>

      <p>The algorithm takes three required inputs: an <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
        an <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and a <i>value</i> to expand.</p>

      <ol class="algorithm">
        <li>If the <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> has a <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a>
          in <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> that is <code>@id</code>, return a new
          <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> containing a single key-value pair where the
          key is <code>@id</code> and the value is the result of using the
          <a href="#iri-expansion"><abbr title="Internationalized Resource Identifier">IRI</abbr> Expansion algorithm</a>, passing
          <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <i>value</i>, and <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for
          <i>document relative</i>.</li>
        <li>If <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> has a <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> in
          <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> that is <code>@vocab</code>, return
          a new <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> containing a single key-value pair
          where the key is <code>@id</code> and the value is the result of
          using the <a href="#iri-expansion"><abbr title="Internationalized Resource Identifier">IRI</abbr> Expansion algorithm</a>, passing
          <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <i>value</i>, <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for
          <i>vocab</i>, and <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for
          <i>document relative</i>.</li>
        <li>Otherwise, initialize <i>result</i> to a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>
          with an <code>@value</code> member whose value is set to
          <i>value</i>.</li>
        <li>If <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> has a <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> in
          <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, add an <code>@type</code> member to
          <i>result</i> and set its value to the value associated with the
          <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a>.</li>
        <li>Otherwise, if <i>value</i> is a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>:
          <ol class="algorithm">
            <li>If a <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> is associated with
              <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> in <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
              add an <code>@language</code> to <i>result</i> and set its
              value to the language code associated with the
              <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a>; unless the
              <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> is set to <a class="tref internalDFN" title="null" href="#dfn-null">null</a> in
              which case no member is added.</li>
            <li>Otherwise, if the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> has a
              <a class="tref internalDFN" title="default-language" href="#dfn-default-language">default language</a>, add an <code>@language</code>
              to <i>result</i> and set its value to the
              <a class="tref internalDFN" title="default-language" href="#dfn-default-language">default language</a>.</li>
          </ol>
        </li>
        <li>Return <i>result</i>.</li>
      </ol>
    </section>
  </section> <!-- end of Value Expansion -->

</section> <!-- end of Expansion section -->


<section id="compaction-algorithms">
  <!--OddPage--><h2 aria-level="1" role="heading" id="h2_compaction-algorithms"><span class="secno">8. </span>Compaction Algorithms</h2>

  <section id="compaction-algorithm">
    <h3 aria-level="2" role="heading" id="h3_compaction-algorithm"><span class="secno">8.1 </span>Compaction Algorithm</h3>

    <p>This algorithm compacts a JSON-LD document, such that the given
      <a class="tref internalDFN" title="context" href="#dfn-context">context</a> is applied. This must result in shortening
      any applicable <a class="tref internalDFN" title="iri" href="#dfn-iri">IRIs</a> to
      <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> or
      <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact IRIs</a>, any applicable
      <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keywords</a> to
      <a class="tref internalDFN" title="keyword-alias" href="#dfn-keyword-alias">keyword aliases</a>, and
      any applicable <a class="tref internalDFN" title="json-ld-value" href="#dfn-json-ld-value">JSON-LD values</a>
      expressed in <a class="tref internalDFN" title="expanded-form" href="#dfn-expanded-form">expanded form</a> to simple values such as
      <a class="tref internalDFN" title="string" href="#dfn-string">strings</a> or
      <a class="tref internalDFN" title="number" href="#dfn-number">numbers</a>.</p>

    <section class="informative">
      <h4 id="overview-5" aria-level="3" role="heading">Overview</h4><p><em>This section is non-normative.</em></p>

      <p>Starting with its root <i>element</i>, we can process the
        JSON-LD document recursively, until we have a fully
        <a class="tref internalDFN" title="compaction" href="#dfn-compaction">compacted</a> <i>result</i>. When
        <a class="tref internalDFN" title="compaction" href="#dfn-compaction">compacting</a> an <i>element</i>, we can treat
        each one differently according to its type, in order to break down the
        problem:</p>

      <ol>
        <li>If the <i>element</i> is a <a class="tref internalDFN" title="scalar" href="#dfn-scalar">scalar</a>, it is
          already in <a class="tref internalDFN" title="compacted-form" href="#dfn-compacted-form">compacted form</a>, so we simply return it.</li>
        <li>If the <i>element</i> is an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, we compact
          each of its items recursively and return them in a new
          <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
        <li>Otherwise <i>element</i> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>. The value
          of each key in element is compacted recursively. Some of the keys will be
          compacted, using the <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>,
          to <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> or <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact IRIs</a>
          and others will be compacted from <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keywords</a> to
          <a class="tref internalDFN" title="keyword-alias" href="#dfn-keyword-alias">keyword aliases</a> or simply left
          unchanged because they do not have definitions in the <a class="tref internalDFN" title="context" href="#dfn-context">context</a>.
          Values will be converted to <a class="tref internalDFN" title="compacted-form" href="#dfn-compacted-form">compacted form</a> via the
          <a href="#value-compaction">Value Compaction algorithm</a>. Some data
          will be reshaped based on <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mappings</a>
          specified in the context such as <code>@index</code> or <code>@language</code>
          maps.</li>
      </ol>

      <p>The final output is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> with a <code>@context</code>
        key, if a non-empty <a class="tref internalDFN" title="context" href="#dfn-context">context</a> was given, where the <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>
        is either <i>result</i> or a wrapper for it where <i>result</i> appears
        as the value of an (aliased) <code>@graph</code> key because <i>result</i>
        contained two or more items in an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</p>
    </section>

    <section>
      <h4 id="algorithm-5" aria-level="3" role="heading">Algorithm</h4>

      <p>The algorithm takes five required input variables: an <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
        an <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>, an <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, an
        <i>element</i> to be compacted, and a flag
        <code class="idlMemberName"><a href="#widl-JsonLdOptions-compactArrays">compactArrays</a></code>.
        To begin, the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> is set to the result of
        performing <a href="#context-processing-algorithm">Context Processing</a>
        on the passed <a class="tref internalDFN" title="context" href="#dfn-context">context</a>, the <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a> is
        set to the result of performing the
        <a href="#inverse-context-creation">Inverse Context Creation algorithm</a>
        on <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, the <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> is
        set to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, <i>element</i> is set to the result of
        performing the <a href="#expansion-algorithm">Expansion algorithm</a>
        on the <a class="tref internalDFN" title="json-ld-input" href="#dfn-json-ld-input">JSON-LD input</a>, and, if not passed,
        <code class="idlMemberName"><a href="#widl-JsonLdOptions-compactArrays">compactArrays</a></code>
        is set to <a class="tref internalDFN" title="true" href="#dfn-true">true</a>.</p>

      <ol class="algorithm">
        <li>If <i>element</i> is a <a class="tref internalDFN" title="scalar" href="#dfn-scalar">scalar</a>, it is already in its most
          compact form, so simply return <i>element</i>.</li>
        <li>If <i>element</i> is an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>:
          <ol class="algorithm">
            <li>Initialize <i>result</i> to an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
            <li>For each <i>item</i> in <i>element</i>:
              <ol class="algorithm">
                <li>Initialize <i>compacted item</i> to the result of using this
                  algorithm recursively, passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
                  <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>, <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and
                  <em>item</em> for <i>element</i>.</li>
                <li>If <i>compacted item</i> is not <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, then append
                  it to <i>result</i>.</li>
              </ol>
            </li>
            <li>If <i>result</i> contains only one item (it has a length of
              <code>1</code>), <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> has no
              <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> in <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, and
              <code class="idlMemberName"><a href="#widl-JsonLdOptions-compactArrays">compactArrays</a></code>
              is <a class="tref internalDFN" title="true" href="#dfn-true">true</a>, set <i>result</i> to its only item.</li>
            <li>Return <i>result</i>.</li>
          </ol>
        </li>
        <li>Otherwise <i>element</i> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>.</li>
        <li>If <i>element</i> has an <code>@value</code> or <code>@id</code>
          member and the result of using the
          <a href="#value-compaction">Value Compaction algorithm</a>,
          passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
          <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>,and <i>element</i> as <i>value</i> is
          a <a class="tref internalDFN" title="scalar" href="#dfn-scalar">scalar</a>, return that result.</li>
        <li>Initialize <i>inside reverse</i> to <a class="tref internalDFN" title="true" href="#dfn-true">true</a> if
          <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> equals <code>@reverse</code>,
          otherwise to <a class="tref internalDFN" title="false" href="#dfn-false">false</a>.</li>
        <li>Initialize <i>result</i> to an empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>.</li>
        <li>For each key <i>expanded property</i> and value <i>expanded value</i>
          in <i>element</i>,  ordered lexicographically by <i>expanded property</i>:
          <ol class="algorithm">
            <li>If <i>expanded property</i> is <code>@id</code> or
              <code>@type</code>:
                <ol class="algorithm">
                  <li>If <i>expanded value</i> is a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>,
                    then initialize <i>compacted value</i> to the result
                    of using the <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>,
                    passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
                    <i>expanded value</i> for <i>iri</i>,
                    and <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i> if
                    <i>expanded property</i> is <code>@type</code>,
                    <a class="tref internalDFN" title="false" href="#dfn-false">false</a> otherwise.</li>
                  <li>Otherwise, <i>expanded value</i> must be a
                    <code>@type</code> <a class="tref internalDFN" title="array" href="#dfn-array">array</a>:
                    <ol class="algorithm">
                      <li>Initialize <i>compacted value</i> to an empty
                        <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
                      <li>For each item <i>expanded type</i> in
                        <i>expanded value</i>, append the result of
                        of using the <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>,
                        passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
                        <i>expanded type</i> for <i>iri</i>, and
                        <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i>,
                        to <i>compacted value</i>.</li>
                      <li>If <i>compacted value</i> contains only one
                        item (it has a length of <code>1</code>), then
                        set <i>compacted value</i> to its only item.</li>
                    </ol>
                  </li>
                  <li>Initialize <i>alias</i> to the result of using the
                    <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>,
                    passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
                    <i>expanded property</i> for <i>iri</i>,
                    and <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i>.</li>
                  <li>Add a member <i>alias</i> to <i>result</i> whose value is
                    set to <i>compacted value</i> and continue to the next
                    <i>expanded property</i>.</li>
                </ol>
              </li>
            <li>If <i>expanded property</i> is <code>@reverse</code>:
              <ol class="algorithm">
                <li>Initialize <i>compacted value</i> to the result of using this
                  algorithm recursively, passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
                  <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>, <code>@reverse</code> for
                  <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and <i>expanded value</i>
                  for <i>element</i>.</li>
                <li>For each <i>property</i> and <i>value</i> in <i>compacted value</i>:
                  <ol class="algorithm">
                    <li>If the <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> for <i>property</i> in the
                      <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> indicates that <i>property</i> is
                      a <a class="tref internalDFN" title="reverse-property" href="#dfn-reverse-property">reverse property</a>
                      <ol class="algorithm">
                        <li>If the <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> for <i>property</i> in
                          the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> has a
                          <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> of <code>@set</code> or
                          <code class="idlMemberName"><a href="#widl-JsonLdOptions-compactArrays">compactArrays</a></code>
                          is <a class="tref internalDFN" title="false" href="#dfn-false">false</a>, and <i>value</i> is not an
                          <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, set <i>value</i> to a new
                          <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing only <i>value</i>.</li>
                        <li>If <i>property</i> is not a member of
                          <i>result</i>, add one and set its value to <i>value</i>.</li>
                        <li>Otherwise, if the value of the <i>property</i> member of
                          <i>result</i> is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, set it to a new
                          <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing only the value. Then
                          append <i>value</i> to its value if <i>value</i>
                          is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, otherwise append each
                          of its items.</li>
                        <li>Remove the <i>property</i> member from
                          <i>compacted value</i>.</li>
                      </ol>
                    </li>
                  </ol>
                </li>
                <li>If <i>compacted value</i> has some remaining members, i.e.,
                  it is not an empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>:
                  <ol class="algorithm">
                    <li>Initialize <i>alias</i> to the result of using the
                      <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>,
                      passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
                      <code>@reverse</code> for <i>iri</i>,
                      and <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i>.</li>
                    <li>Set the value of the <i>alias</i> member of <i>result</i> to
                      <i>compacted value</i>.</li>
                  </ol>
                </li>
                <li>Continue with the next <i>expanded property</i> from <i>element</i>.</li>
              </ol>
            </li>
            <li>If <i>expanded property</i> is <code>@index</code> and
              <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> has a <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a>
              in <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> that is <code>@index</code>,
              then the compacted result will be inside of an <code>@index</code>
              container, drop the <code>@index</code> property by continuing
              to the next <i>expanded property</i>.</li>
            <li>Otherwise, if <i>expanded property</i> is <code>@index</code>,
              <code>@value</code>, or <code>@language</code>:
              <ol class="algorithm">
                <li>Initialize <i>alias</i> to the result of using
                  the <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>,
                  passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
                  <i>expanded property</i> for <i>iri</i>,
                  and <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i>.</li>
                <li>Add a member <i>alias</i> to <i>result</i> whose value is
                  set to <i>expanded value</i> and continue with the next
                  <i>expanded property</i>.</li>
              </ol>
            </li>
            <li>If <i>expanded value</i> is an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>:
              <ol class="algorithm">
                <li>Initialize <i>item active property</i> to the result of
                  using the <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>,
                  passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
                  <i>expanded property</i> for <i>iri</i>,
                  <i>expanded value</i> for <i>value</i>,
                  <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i>, and
                  <i>inside reverse</i>.</li>
                <li>If <i>result</i> does not have the key that equals
                  <i>item active property</i>, set this key's value in
                  <i>result</i> to an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>. Otherwise, if
                  the key's value is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, then set it
                  to one containing only the value.</li>
              </ol>
            </li>
            <li>
              At this point, <i>expanded value</i> must be an
              <a class="tref internalDFN" title="array" href="#dfn-array">array</a> due to the
              <a href="#expansion-algorithm">Expansion algorithm</a>.
              For each item <i>expanded item</i> in <i>expanded value</i>:
              <ol class="algorithm">
                <li>Initialize <i>item active property</i> to the result of using
                  the <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>,
                  passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
                  <i>expanded property</i> for <i>iri</i>,
                  <i>expanded item</i> for <i>value</i>,
                  <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i>, and
                  <i>inside reverse</i>.</li>
                <li>Initialize <i>container</i> to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>. If there
                  is a <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> for
                  <i>item active property</i> in <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
                  set <i>container</i> to its value.</li>
                <li>Initialize <i>compacted item</i> to the result of using
                  this algorithm recursively, passing
                  <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
                  <i>item active property</i> for <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>,
                  <i>expanded item</i> for <i>element</i> if it does
                  not contain the key <code>@list</code>, otherwise pass
                  the key's associated value for <i>element</i>.</li>
                <li>
                  If <i>expanded item</i> is a <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a>:
                  <ol class="algorithm">
                    <li>If <i>compacted item</i> is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>,
                      then set it to an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing only
                      <i>compacted item</i>.</li>
                    <li>If <i>container</i> is not <code>@list</code>:
                      <ol class="algorithm">
                        <li>Convert <i>compacted item</i> to a
                          <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a> by setting it to a
                          <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> containing key-value pair
                          where the key is the result of the
                          <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>,
                          passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
                          <code>@list</code> for <i>iri</i>, and <i>compacted item</i>
                          for <i>value</i>.</li>
                        <li>If <i>expanded item</i> contains the key
                          <code>@index</code>, then add a key-value pair
                          to <i>compacted item</i> where the key is the
                          result of the <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>,
                          passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
                          <code>@index</code> as <i>iri</i>, and the value associated with the
                          <code>@index</code> key in <i>expanded item</i> as <i>value</i>.</li>
                      </ol>
                    </li>
                    <li>Otherwise, <i>item active property</i> must not be a key
                      in <i>result</i> because there cannot be two
                      <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list objects</a> associated
                      with an <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> that has a
                      <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a>; a
                      <code class="error"><a href="#idl-def-JsonLdErrorCode.compaction-to-list-of-lists">compaction to list of lists</a></code>
                      error has been detected and processing is aborted.</li>
                  </ol>
                </li>
                <li>
                  If <i>container</i> is <code>@language</code> or
                  <code>@index</code>:
                  <ol class="algorithm">
                    <li>If <i>item active property</i> is not a key in
                      <i>result</i>, initialize it to an empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>.
                      Initialize <i>map object</i> to the value of <i>item active property</i>
                      in <i>result</i>.</li>
                    <li>If <i>container</i> is <code>@language</code> and
                      <i>compacted item</i> contains the key
                      <code>@value</code>, then set <i>compacted item</i>
                      to the value associated with its <code>@value</code> key.</li>
                    <li>Initialize <i>map key</i> to the value associated with
                      with the key that equals <i>container</i> in
                      <i>expanded item</i>.</li>
                    <li>If <i>map key</i> is not a key in <i>map object</i>,
                      then set this key's value in <i>map object</i>
                      to <i>compacted item</i>. Otherwise, if the value
                      is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, then set it to one
                      containing only the value and then append
                      <i>compacted item</i> to it.</li>
                  </ol>
                </li>
                <li>
                  Otherwise,
                  <ol class="algorithm">
                    <li>If
                      <code class="idlMemberName"><a href="#widl-JsonLdOptions-compactArrays">compactArrays</a></code>
                      is <a class="tref internalDFN" title="false" href="#dfn-false">false</a>, <i>container</i> is <code>@set</code> or
                      <code>@list</code>, or <i>expanded property</i> is
                      <code>@list</code> or <code>@graph</code> and
                      <i>compacted item</i> is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>,
                      set it to a new <a class="tref internalDFN" title="array" href="#dfn-array">array</a>
                      containing only <i>compacted item</i>.</li>
                    <li>If <i>item active property</i> is not a key in
                      <i>result</i> then add the key-value pair,
                      (<i>item active property</i>-<i>compacted item</i>),
                      to <i>result</i>.</li>
                    <li>Otherwise, if the value associated with the key that
                      equals <i>item active property</i> in <i>result</i>
                      is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, set it to a new
                      <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing only the value. Then
                      append <i>compacted item</i> to the value if
                      <i>compacted item</i> is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>,
                      otherwise, concatenate it.</li>
                  </ol>
                </li>
              </ol>
            </li>
          </ol>
        </li>
        <li>Return <i>result</i>.</li>
      </ol>

      <p>If, after the algorithm outlined above is run, the result <i>result</i>
        is an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, replace it with a new
        <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> with a single member whose key is the result
        of using the <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>,
        passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>, and
        <code>@graph</code> as <i>iri</i> and whose value is the <a class="tref internalDFN" title="array" href="#dfn-array">array</a>
        <i>result</i>. Finally, if a non-empty <i>context</i> has been passed,
        add an <code>@context</code> member to <i>result</i> and set its value
        to the passed <i>context</i>.</p>
    </section>
  </section> <!-- end of Compaction -->

  <section id="inverse-context-creation">
    <h3 aria-level="2" role="heading" id="h3_inverse-context-creation"><span class="secno">8.2 </span>Inverse Context Creation</h3>

    <p>When there is more than one <a class="tref internalDFN" title="term" href="#dfn-term">term</a> that could be chosen
      to compact an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>, it has to be ensured that the <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
      selection is both deterministic and represents the most context-appropriate
      choice whilst taking into consideration algorithmic complexity.</p>

    <p>In order to make <a class="tref internalDFN" title="term" href="#dfn-term">term</a> selections, the concept of an
      <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a> is introduced. An <dfn title="inverse-context" id="dfn-inverse-context">inverse context</dfn>
      is essentially a reverse lookup table that maps
      <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mappings</a>,
      <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mappings</a>, and
      <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mappings</a> to a simple
      <a class="tref internalDFN" title="term" href="#dfn-term">term</a> for a given <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>. A
      <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a> only needs to be generated for an
      <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> if it is being used for <a class="tref internalDFN" title="compaction" href="#dfn-compaction">compaction</a>.</p>

    <p>To make use of an <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>, a list of preferred
      <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mappings</a> and the
      <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> are gathered
      for a particular value associated with an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>. These parameters
      are then fed to the <a href="#term-selection">Term Selection algorithm</a>,
      which will find the <a class="tref internalDFN" title="term" href="#dfn-term">term</a> that most appropriately
      matches the value's mappings.</p>

    <section class="informative">
      <h4 id="overview-6" aria-level="3" role="heading">Overview</h4><p><em>This section is non-normative.</em></p>

      <p>To create an <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a> for a given
        <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, each <a class="tref internalDFN" title="term" href="#dfn-term">term</a> in the
        <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> is visited, ordered by length, shortest
        first (ties are broken by choosing the lexicographically least
        <a class="tref internalDFN" title="term" href="#dfn-term">term</a>). For each <a class="tref internalDFN" title="term" href="#dfn-term">term</a>, an entry is added to
        the <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a> for each possible combination of
        <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> and <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a>
        or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> that would legally match the
        <a class="tref internalDFN" title="term" href="#dfn-term">term</a>. Illegal matches include differences between a
        value's <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> and
        that of the <a class="tref internalDFN" title="term" href="#dfn-term">term</a>. If a <a class="tref internalDFN" title="term" href="#dfn-term">term</a> has no
        <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a>, <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a>, or
        <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> (or some combination of these), then it
        will have an entry in the <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a> using the special
        key <code>@none</code>. This allows the
        <a href="#term-selection">Term Selection algorithm</a> to fall back
        to choosing more generic <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> when a more
        specifically-matching <a class="tref internalDFN" title="term" href="#dfn-term">term</a> is not available for a particular
        <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> and value combination.</p>
    </section>

    <section>
      <h4 id="algorithm-6" aria-level="3" role="heading">Algorithm</h4>

      <p>The algorithm takes one required input: the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> that
        the <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a> is being created for.</p>

      <ol class="algorithm">
        <li>Initialize <i>result</i> to an empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>.</li>
        <li>Initialize <i>default language</i> to <code>@none</code>. If the
          <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> has a <a class="tref internalDFN" title="default-language" href="#dfn-default-language">default language</a>,
          set <i>default language</i> to it.</li>
        <li>For each key <a class="tref internalDFN" title="term" href="#dfn-term">term</a> and value <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> in
          the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, ordered by shortest <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
          first (breaking ties by choosing the lexicographically least
          <a class="tref internalDFN" title="term" href="#dfn-term">term</a>):
          <ol class="algorithm">
            <li>If the <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>,
              <a class="tref internalDFN" title="term" href="#dfn-term">term</a> cannot be selected during <a class="tref internalDFN" title="compaction" href="#dfn-compaction">compaction</a>,
              so continue to the next <a class="tref internalDFN" title="term" href="#dfn-term">term</a>.</li>
            <li>Initialize <i>container</i> to <code>@none</code>. If there
              is a <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> in
              <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>, set <i>container</i> to
              its associated value.</li>
            <li>Initialize <i>iri</i> to the value of the <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a>
              for the <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>.</li>
            <li>If <i>iri</i> is not a key in <i>result</i>, add
              a key-value pair where the key is <i>iri</i> and the value
              is an empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> to <i>result</i>.</li>
            <li>Reference the value associated with the <i>iri</i> member in
              <i>result</i> using the variable <i>container map</i>.</li>
            <li>If <i>container map</i> has no <i>container</i> member,
              create one and set its value to a new
              <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> with two members. The first member is
              <code>@language</code> and its value is a new empty
              <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>, the second member is <code>@type</code>
              and its value is a new empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>.</li>
            <li>Reference the value associated with the <i>container</i> member
              in <i>container map</i> using the variable <i>type/language map</i>.</li>
            <li>If the <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> indicates that the <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
              represents a <a class="tref internalDFN" title="reverse-property" href="#dfn-reverse-property">reverse property</a>:
              <ol class="algorithm">
                <li>Reference the value associated with the <code>@type</code>
                  member in <i>type/language map</i> using the variable
                  <i>type map</i>.</li>
                <li>If <i>type map</i> does not have a <code>@reverse</code>
                  member, create one and set its value to the <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
                  being processed.</li>
              </ol>
            </li>
            <li>Otherwise, if <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> has a
              <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a>:
              <ol class="algorithm">
                <li>Reference the value associated with the <code>@type</code>
                  member in <i>type/language map</i> using the variable
                  <i>type map</i>.</li>
                <li>If <i>type map</i> does not have a member corresponding
                  to the <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> in <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>,
                  create one and set its value to the <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
                  being processed.</li>
              </ol>
            </li>
            <li>Otherwise, if <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> has a
              <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> (might be <a class="tref internalDFN" title="null" href="#dfn-null">null</a>):
              <ol class="algorithm">
                <li>Reference the value associated with the <code>@language</code>
                  member in <i>type/language map</i> using the variable
                  <i>language map</i>.</li>
                <li>If the <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> equals <a class="tref internalDFN" title="null" href="#dfn-null">null</a>,
                  set <i>language</i> to <code>@null</code>; otherwise set it
                  to the language code in <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a>.</li>
                <li>If <i>language map</i> does not have a <i>language</i> member,
                  create one and set its value to the <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
                  being processed.</li>
              </ol>
            </li>
            <li>Otherwise:
              <ol class="algorithm">
                <li>Reference the value associated with the <code>@language</code>
                  member in <i>type/language map</i> using the variable
                  <i>language map</i>.</li>
                <li>If <i>language map</i> does not have a <i>default language</i>
                  member, create one and set its value to the <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
                  being processed.</li>
                <li>If <i>language map</i> does not have a <code>@none</code>
                  member, create one and set its value to the <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
                  being processed.</li>
                <li>Reference the value associated with the <code>@type</code>
                  member in <i>type/language map</i> using the variable
                  <i>type map</i>.</li>
                <li>If <i>type map</i> does not have a <code>@none</code>
                  member, create one and set its value to the <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
                  being processed.</li>
              </ol>
            </li>
          </ol>
        </li>
        <li>Return <i>result</i>.</li>
      </ol>
    </section>
  </section> <!-- end of Inverse Context Creation -->

  <section id="iri-compaction">
    <h3 aria-level="2" role="heading" id="h3_iri-compaction"><span class="secno">8.3 </span><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction</h3>

    <p>This algorithm compacts an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> to a <a class="tref internalDFN" title="term" href="#dfn-term">term</a> or
      <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact <abbr title="Internationalized Resource Identifier">IRI</abbr></a>, or a <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a> to a
      <a class="tref internalDFN" title="keyword-alias" href="#dfn-keyword-alias">keyword alias</a>. A value that is associated with the
      <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> may be passed in order to assist in selecting the most
      context-appropriate <a class="tref internalDFN" title="term" href="#dfn-term">term</a>.</p>

    <section class="informative">
      <h4 id="overview-7" aria-level="3" role="heading">Overview</h4><p><em>This section is non-normative.</em></p>

      <p>If the passed <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, we simply
        return <a class="tref internalDFN" title="null" href="#dfn-null">null</a>. Otherwise, we first try to find a <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
        that the <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> or <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a> can be compacted to if
        it is relative to <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context's</a>
        <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>. In order to select the most appropriate
        <a class="tref internalDFN" title="term" href="#dfn-term">term</a>, we may have to collect information about the passed
        <i>value</i>. This information includes which
        <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mappings</a>
        would be preferred for expressing the <i>value</i>, and what its
        <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> is. For
        <a class="tref internalDFN" title="list-object" href="#dfn-list-object">JSON-LD lists</a>, the <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a>
        or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> will be chosen based on the most
        specific values that work for all items in the list. Once this
        information is gathered, it is passed to the
        <a href="#term-selection">Term Selection algorithm</a>, which will
        return the most appropriate <a class="tref internalDFN" title="term" href="#dfn-term">term</a> to use.</p>

      <p>If no <a class="tref internalDFN" title="term" href="#dfn-term">term</a> was found that could be used to compact the
        <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>, an attempt is made to compact the <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> using the
        <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context's</a> <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>,
        if there is one. If the <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> could not be compacted, an
        attempt is made to find a <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact <abbr title="Internationalized Resource Identifier">IRI</abbr></a>. If there is no
        appropriate <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact <abbr title="Internationalized Resource Identifier">IRI</abbr></a>, the <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> is
        transformed to a <a class="tref internalDFN" title="relative-iri" href="#dfn-relative-iri">relative <abbr title="Internationalized Resource Identifier">IRI</abbr></a> using the document's
        <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a>. Finally, if the <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> or
        <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a> still could not be compacted, it is returned
        as is.</p>
    </section>

    <section>
      <h4 id="algorithm-7" aria-level="3" role="heading">Algorithm</h4>

      <p>This algorithm takes three required inputs and three optional inputs.
        The required inputs are an <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, an <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
        and the <i>iri</i> to be compacted. The optional inputs are a <i>value</i> associated
        with the <i>iri</i>, a <i>vocab</i> flag which specifies whether the
        passed <i>iri</i> should be compacted using the
        <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context's</a>
        <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>, and a <i>reverse</i> flag which specifies whether
        a <a class="tref internalDFN" title="reverse-property" href="#dfn-reverse-property">reverse property</a> is being compacted. If not passed, <i>value</i> is set to
        <a class="tref internalDFN" title="null" href="#dfn-null">null</a> and <i>vocab</i> and <i>reverse</i> are both set to
        <code>false</code>.</p>

      <ol class="algorithm">
        <li>If <i>iri</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, return <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</li>
        <li>If <i>vocab</i> is <a class="tref internalDFN" title="true" href="#dfn-true">true</a> and <i>iri</i> is a
          key in <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>:
          <ol class="algorithm">
            <li>Initialize <i>default language</i> to
              <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context's</a>
              <a class="tref internalDFN" title="default-language" href="#dfn-default-language">default language</a>, if it has one, otherwise to
              <code>@none</code>.</li>
            <li>Initialize <i>containers</i> to an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>. This
              <a class="tref internalDFN" title="array" href="#dfn-array">array</a> will be used to keep track of an ordered list of
              preferred <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mappings</a>
              for a <a class="tref internalDFN" title="term" href="#dfn-term">term</a>, based on what is compatible with
              <i>value</i>.</li>
            <li>Initialize <i>type/language</i> to <code>@language</code>,
              and <i>type/language value</i> to <code>@null</code>. These two
              variables will keep track of the preferred
              <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> for
              a <a class="tref internalDFN" title="term" href="#dfn-term">term</a>, based on what is compatible with <i>value</i>.</li>
            <li>If <i>value</i> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> that contains the
              key <code>@index</code>, then append the value <code>@index</code>
              to <i>containers</i>.</li>
            <li>If <i>reverse</i> is <a class="tref internalDFN" title="true" href="#dfn-true">true</a>, set <i>type/language</i>
              to <code>@type</code>, <i>type/language value</i> to
              <code>@reverse</code>, and append <code>@set</code> to <i>containers</i>.</li>
            <li>Otherwise, if <i>value</i> is a <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a>, then set
              <i>type/language</i> and <i>type/language value</i>
              to the most specific values that work for all items in
              the list as follows:
              <ol class="algorithm">
                <li>If <code>@index</code> is a not key in <i>value</i>, then
                  append <code>@list</code> to <i>containers</i>.</li>
                <li>Initialize <i>list</i> to the <a class="tref internalDFN" title="array" href="#dfn-array">array</a> associated
                  with the key <code>@list</code> in <i>value</i>.</li>
                <li>Initialize <i>common type</i> and <i>common language</i> to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>. If
                  <i>list</i> is empty, set <i>common language</i> to
                  <i>default language</i>.</li>
                <li>For each <i>item</i> in <i>list</i>:
                  <ol class="algorithm">
                    <li>Initialize <i>item language</i> to <code>@none</code> and
                      <i>item type</i> to <code>@none</code>.</li>
                    <li>If <i>item</i> contains the key <code>@value</code>:
                      <ol class="algorithm">
                        <li>If <i>item</i> contains the key <code>@language</code>,
                          then set <i>item language</i> to its associated
                          value.</li>
                        <li>Otherwise, if <i>item</i> contains the key
                          <code>@type</code>, set <i>item type</i> to its
                          associated value.</li>
                        <li>Otherwise, set <i>item language</i> to
                          <code>@null</code>.</li>
                      </ol>
                    </li>
                    <li>Otherwise, set <i>item type</i> to <code>@id</code>.</li>
                    <li>If <i>common language</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set it
                      to <i>item language</i>.</li>
                    <li>Otherwise, if <i>item language</i> does not equal
                      <i>common language</i> and <i>item</i> contains the
                      key <code>@value</code>, then set <i>common language</i>
                      to <code>@none</code> because list items have conflicting
                      languages.</li>
                    <li>If <i>common type</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set it
                      to <i>item type</i>.</li>
                    <li>Otherwise, if <i>item type</i> does not equal
                      <i>common type</i>, then set <i>common type</i>
                      to <code>@none</code> because list items have conflicting
                      types.</li>
                    <li>If <i>common language</i> is <code>@none</code> and
                      <i>common type</i> is <code>@none</code>, then
                      stop processing items in the list because it has been
                      detected that there is no common language or type amongst
                      the items.</li>
                  </ol>
                </li>
                <li>If <i>common language</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set it to
                  <code>@none</code>.</li>
                <li>If <i>common type</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set it to
                  <code>@none</code>.</li>
                <li>If <i>common type</i> is not <code>@none</code> then set
                  <i>type/language</i> to <code>@type</code> and
                  <i>type/language value</i> to <i>common type</i>.</li>
                <li>Otherwise, set <i>type/language value</i> to
                  <i>common language</i>.</li>
              </ol>
            </li>
            <li>Otherwise:
              <ol class="algorithm">
                <li>If <i>value</i> is a <a class="tref internalDFN" title="value-object" href="#dfn-value-object">value object</a>:
                  <ol class="algorithm">
                    <li>If <i>value</i> contains the key <code>@language</code>
                      and does not contain the key <code>@index</code>,
                      then set <i>type/language value</i> to its associated
                      value and append <code>@language</code> to
                      <i>containers</i>.</li>
                    <li>Otherwise, if <i>value</i> contains the key
                      <code>@type</code>, then set <i>type/language value</i> to
                      its associated value and set <i>type/language</i> to
                      <code>@type</code>.</li>
                  </ol>
                </li>
                <li>Otherwise, set <i>type/language</i> to <code>@type</code>
                  and set <i>type/language value</i> to <code>@id</code>.</li>
                <li>Append <code>@set</code> to <i>containers</i>.</li>
              </ol>
            </li>
            <li>Append <code>@none</code> to <i>containers</i>. This represents
              the non-existence of a <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a>, and it will
              be the last <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> value to be checked as it
              is the most generic.</li>
            <li>If <i>type/language value</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set it to
              <code>@null</code>. This is the key under which <a class="tref internalDFN" title="null" href="#dfn-null">null</a> values
              are stored in the <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a> <i>entry</i>.</li>
            <li>Initialize <i>preferred values</i> to an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.
              This <a class="tref internalDFN" title="array" href="#dfn-array">array</a> will indicate, in order, the preferred values for
              a <a class="tref internalDFN" title="term" href="#dfn-term">term's</a> <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or
              <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a>.</li>
            <li>If <i>type/language value</i> is <code>@reverse</code>, append
              <code>@reverse</code> to <i>preferred values</i>.</li>
            <li>If <i>type/language value</i> is <code>@id</code> or <code>@reverse</code>
              and <i>value</i> has an <code>@id</code> member:
              <ol class="algorithm">
                <li>If the result of using the
                  <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> compaction algorithm</a>,
                  passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
                  the value associated with the <code>@id</code> key in <i>value</i> for
                  <i>iri</i>, <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i>, and
                  <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>document relative</i> has a
                  <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> in the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>
                  with an <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a> that equals the value associated
                  with the <code>@id</code> key in <i>value</i>,
                  then append <code>@vocab</code>, <code>@id</code>, and
                  <code>@none</code>, in that order, to <i>preferred values</i>.</li>
                <li>Otherwise, append <code>@id</code>, <code>@vocab</code>, and
                  <code>@none</code>, in that order, to <i>preferred values</i>.</li>
              </ol>
            </li>
            <li>Otherwise, append <i>type/language value</i> and <code>@none</code>, in
              that order, to <i>preferred values</i>.</li>
            <li>Initialize <i>term</i> to the result of the
              <a href="#term-selection">Term Selection algorithm</a>, passing
              <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>, <i>iri</i>, <i>containers</i>,
              <i>type/language</i>, and <i>preferred values</i>.</li>
            <li>If <i>term</i> is not <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, return <i>term</i>.</li>
          </ol>
        </li>
        <li>At this point, there is no simple <a class="tref internalDFN" title="term" href="#dfn-term">term</a> that <i>iri</i>
          can be compacted to. If <i>vocab</i> is <a class="tref internalDFN" title="true" href="#dfn-true">true</a> and
          <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> has a <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>:
          <ol class="algorithm">
            <li>If <i>iri</i> begins with the
              <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping's</a> value
              but is longer, then initialize <i>suffix</i> to the substring
              of <i>iri</i> that does not match. If <i>suffix</i> does not
              have a <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> in <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
              then return <i>suffix</i>.</li>
          </ol>
        </li>
        <li>The <i>iri</i> could not be compacted using the
          <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context's</a> <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>.
          Try to create a <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact <abbr title="Internationalized Resource Identifier">IRI</abbr></a>, starting by initializing
          <i>compact <abbr title="Internationalized Resource Identifier">IRI</abbr></i> to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>. This variable will be used to
          tore the created <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact <abbr title="Internationalized Resource Identifier">IRI</abbr></a>, if any.</li>
        <li>For each key <a class="tref internalDFN" title="term" href="#dfn-term">term</a> and value <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> in
          the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>:
          <ol class="algorithm">
            <li>If the <a class="tref internalDFN" title="term" href="#dfn-term">term</a> contains a colon (<code>:</code>),
              then continue to the next <a class="tref internalDFN" title="term" href="#dfn-term">term</a> because
              <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> with colons can't be
              used as <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefixes</a>.</li>
            <li>If the <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>,
              its <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a> equals <i>iri</i>, or its
              <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a> is not a substring at the beginning of
              <i>iri</i>, the <a class="tref internalDFN" title="term" href="#dfn-term">term</a> cannot be used as a <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a>
              because it is not a partial match with <i>iri</i>.
              Continue with the next <a class="tref internalDFN" title="term" href="#dfn-term">term</a>.</li>
            <li>Initialize <i>candidate</i> by concatenating <a class="tref internalDFN" title="term" href="#dfn-term">term</a>,
              a colon (<code>:</code>), and the substring of <i>iri</i>
              that follows after the value of the
              <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition's</a>
              <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a>.</li>
            <li>If either <i>compact <abbr title="Internationalized Resource Identifier">IRI</abbr></i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a> or <i>candidate</i> is
              shorter or the same length but lexicographically less than
              <i>compact <abbr title="Internationalized Resource Identifier">IRI</abbr></i> and <i>candidate</i> does not have a
              <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> in <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> or if the
              <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> has an <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a>
              that equals <i>iri</i> and <i>value</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>,
              set <i>compact <abbr title="Internationalized Resource Identifier">IRI</abbr></i> to <i>candidate</i>.</li>
          </ol>
        </li>
        <li>If <i>compact <abbr title="Internationalized Resource Identifier">IRI</abbr></i> is not <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, return <i>compact <abbr title="Internationalized Resource Identifier">IRI</abbr></i>.</li>
        <li>If <i>vocab</i> is <a class="tref internalDFN" title="false" href="#dfn-false">false</a> then
          transform <i>iri</i> to a <a class="tref internalDFN" title="relative-iri" href="#dfn-relative-iri">relative <abbr title="Internationalized Resource Identifier">IRI</abbr></a> using
          the document's base <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</li>
        <li>Finally, return <i>iri</i> as is.</li>
      </ol>
    </section>
  </section> <!-- end of IRI Compaction -->

  <section id="term-selection">
    <h3 aria-level="2" role="heading" id="h3_term-selection"><span class="secno">8.4 </span>Term Selection</h3>

    <p>This algorithm, invoked via the <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>,
      makes use of an <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context's</a>
      <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a> to find the <a class="tref internalDFN" title="term" href="#dfn-term">term</a> that is best
      used to <a class="tref internalDFN" title="compaction" href="#dfn-compaction">compact</a> an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>. Other
      information about a value associated with the <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> is given,
      including which <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mappings</a>
      and which <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> would
      be best used to express the value.</p>

    <section class="informative">
      <h4 id="overview-8" aria-level="3" role="heading">Overview</h4><p><em>This section is non-normative.</em></p>

      <p>The <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context's</a> entry for
        the <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> will be first searched according to the preferred
        <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mappings</a>, in the order
        that they are given. Amongst <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> with a matching
        <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a>, preference will be given to those
        with a matching <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a>,
        over those without a <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or
        <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a>. If there is no <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
        with a matching <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> then the <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
        without a <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> that matches the given
        <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> is selected. If
        there is still no selected <a class="tref internalDFN" title="term" href="#dfn-term">term</a>, then a <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
        with no <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> will
        be selected if available. No <a class="tref internalDFN" title="term" href="#dfn-term">term</a> will be selected that
        has a conflicting <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a>.
        Ties between <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> that have the same
        mappings are resolved by first choosing the shortest terms, and then by
        choosing the lexicographically least term. Note that these ties are
        resolved automatically because they were previously resolved when the
        <a href="#inverse-context-creation">Inverse Context Creation algorithm</a>
        was used to create the <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>.</p>
    </section>

    <section>
      <h4 id="algorithm-8" aria-level="3" role="heading">Algorithm</h4>

      <p>This algorithm has five required inputs. They are:
        an <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>, a <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a> or <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>
        <i>iri</i>, an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> <i>containers</i> that represents an
        ordered list of preferred <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mappings</a>,
        a <a class="tref internalDFN" title="string" href="#dfn-string">string</a> <i>type/language</i> that indicates whether
        to look for a <a class="tref internalDFN" title="term" href="#dfn-term">term</a> with a matching <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a>
        or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a>, and an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> representing
        an ordered list of <i>preferred values</i> for the <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a>
        or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> to look for.</p>

      <ol class="algorithm">
        <li>Initialize <i>container map</i> to the value associated with
          <i>iri</i> in the <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>.</li>
        <li>For each item <i>container</i> in <i>containers</i>:
          <ol class="algorithm">
            <li>If <i>container</i> is not a key in <i>container map</i>, then
              there is no <a class="tref internalDFN" title="term" href="#dfn-term">term</a> with a matching
              <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> for it, so continue to the next
              <i>container</i>.</li>
            <li>Initialize <i>type/language map</i> to the value associated
              with the <i>container</i> member in <i>container map</i>.</li>
            <li>Initialize <i>value map</i> to the value associated
              with <i>type/language</i> member in <i>type/language map</i>.</li>
            <li>For each <i>item</i> in <i>preferred values</i>:
              <ol class="algorithm">
                <li>If <i>item</i> is not a key in <i>value map</i>,
                  then there is no <a class="tref internalDFN" title="term" href="#dfn-term">term</a> with a matching
                  <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a>,
                  so continue to the next <i>item</i>.</li>
                <li>Otherwise, a matching term has been found, return the value
                  associated with the <i>item</i> member in
                  <i>value map</i>.</li>
              </ol>
            </li>
          </ol>
        </li>
        <li>No matching term has been found. Return <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</li>
      </ol>
    </section>
  </section> <!-- end of Term Selection -->

  <section id="value-compaction">
    <h3 aria-level="2" role="heading" id="h3_value-compaction"><span class="secno">8.5 </span>Value Compaction</h3>

    <p><a class="tref internalDFN" title="expansion" href="#dfn-expansion">Expansion</a> transforms all values into <a class="tref internalDFN" title="expanded-form" href="#dfn-expanded-form">expanded form</a>
      in JSON-LD. This algorithm performs the opposite operation, transforming
      a value into <dfn title="compacted-form" id="dfn-compacted-form">compacted form</dfn>. This algorithm compacts a
      value according to the <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> in the given
      <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> that is associated with the value's associated
      <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>.</p>

    <section class="informative">
      <h4 id="overview-9" aria-level="3" role="heading">Overview</h4><p><em>This section is non-normative.</em></p>

      <p>The <i>value</i> to compact has either an <code>@id</code> or an
        <code>@value</code> member.</p>

      <p>For the former case, if the <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> of
        <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> is set to <code>@id</code> or <code>@vocab</code>
        and <i>value</i> consists of only an <code>@id</code> member and, if
        the <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> of <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>
        is set to <code>@index</code>, an <code>@index</code> member, <i>value</i>
        can be compacted to a <a class="tref internalDFN" title="string" href="#dfn-string">string</a> by returning the result of
        using the <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>
        to compact the value associated with the <code>@id</code> member.
        Otherwise, <i>value</i> cannot be compacted and is returned as is.</p>

      <p>For the latter case, it might be possible to compact <i>value</i>
        just into the value associated with the <code>@value</code> member.
        This can be done if the <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> has a matching
        <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> and there
        is either no <code>@index</code> member or the <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a>
        of <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> is set to <code>@index</code>. It can
        also be done if <code>@value</code> is the only member in <i>value</i>
        (apart an <code>@index</code> member in case the <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a>
        of <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> is set to <code>@index</code>) and
        either its associated value is not a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, there is
        no <a class="tref internalDFN" title="default-language" href="#dfn-default-language">default language</a>, or there is an explicit
        <a class="tref internalDFN" title="null" href="#dfn-null">null</a> <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> for the
        <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>.</p>
    </section>

    <section>
      <h4 id="algorithm-9" aria-level="3" role="heading">Algorithm</h4>

      <p>This algorithm has four required inputs: an <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, an
        <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,  an <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and a <i>value</i>
        to be compacted.</p>

      <ol class="algorithm">
        <li>Initialize <i>number members</i> to the number of members
          <i>value</i> contains.</li>
        <li>If <i>value</i> has an <code>@index</code> member and the
          <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> associated to <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>
          is set to <code>@index</code>, decrease <i>number members</i> by
          <code>1</code>.</li>
        <li>If <i>number members</i> is greater than <code>2</code>, return
          <i>value</i> as it cannot be compacted.</li>
        <li>If <i>value</i> has an <code>@id</code> member:
          <ol class="algorithm">
            <li>If <i>number members</i> is <code>1</code> and
              the <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> of <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>
              is set to <code>@id</code>, return the result of using the
              <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> compaction algorithm</a>,
              passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
              and the value of the <code>@id</code> member for <i>iri</i>.</li>
            <li>Otherwise, if <i>number members</i> is <code>1</code> and
              the <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> of <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>
              is set to <code>@vocab</code>, return the result of using the
              <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> compaction algorithm</a>,
              passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
              the value of the <code>@id</code> member for <i>iri</i>, and
              <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i>.</li>
            <li>Otherwise, return <i>value</i> as is.</li>
          </ol>
        </li>
        <li>Otherwise, if <i>value</i> has an <code>@type</code> member whose
          value matches the <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> of <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>,
          return the value associated with the <code>@value</code> member
          of <i>value</i>.</li>
        <li>Otherwise, if <i>value</i> has an <code>@language</code> member whose
          value matches the <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> of
          <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, return the value associated with the
          <code>@value</code> member of <i>value</i>.</li>
        <li>Otherwise, if <i>number members</i> equals <code>1</code> and either
          the value of the <code>@value</code> member is not a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>,
          or the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> has no <a class="tref internalDFN" title="default-language" href="#dfn-default-language">default language</a>,
          or the <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> of <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>
          is set to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>,, return the value associated with the
          <code>@value</code> member.</li>
        <li>Otherwise, return <i>value</i> as is.</li>
      </ol>
    </section>
  </section> <!-- end of Value Compaction algorithm -->
</section> <!-- end of Compaction section -->


<section id="flattening-algorithms">
  <!--OddPage--><h2 aria-level="1" role="heading" id="h2_flattening-algorithms"><span class="secno">9. </span>Flattening Algorithms</h2>

  <section id="flattening-algorithm">
    <h3 aria-level="2" role="heading" id="h3_flattening-algorithm"><span class="secno">9.1 </span>Flattening Algorithm</h3>

    <p>This algorithm flattens an expanded JSON-LD document by collecting all
      properties of a <a class="tref internalDFN" title="node" href="#dfn-node">node</a> in a single <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>
      and labeling all <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank nodes</a> with
      <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a>.
      This resulting uniform shape of the document, may drastically simplify
      the code required to process JSON-LD data in certain applications.</p>

    <section class="informative">
      <h4 id="overview-10" aria-level="3" role="heading">Overview</h4><p><em>This section is non-normative.</em></p>

      <p>First, a <i>node map</i> is generated using the
        <a href="#node-map-generation">Node Map Generation algorithm</a>
        which collects all properties of a <a class="tref internalDFN" title="node" href="#dfn-node">node</a> in a single
        <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>. In the next step, the <i>node map</i> is
        converted to a JSON-LD document in
        <a class="tref externalDFN" title="flattened-document-form" href="http://www.w3.org/TR/2013/CR-json-ld-20130910/#flattened-document-form">flattened document form</a>.
        Finally, if a <a class="tref internalDFN" title="context" href="#dfn-context">context</a> has been passed, the flattened document
        is compacted using the <a href="#compaction-algorithm">Compaction algorithm</a>
        before being returned.</p>
    </section>

    <section>
      <h4 id="algorithm-10" aria-level="3" role="heading">Algorithm</h4>

      <p>The algorithm takes two input variables, an <i>element</i> to flatten and
        an optional <i>context</i> used to compact the flattened document. If not
        passed, <i>context</i> is set to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</p>

      <p>This algorithm generates new <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a>
        and relabels existing <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a>.
        The used <a href="#generate-blank-node-identifier">Generate Blank Node Identifier algorithm</a>
        keeps an <i>identifier map</i> and a <i>counter</i> to ensure consistent
        relabeling and avoid collisions. Thus, before this algorithm is run,
        the <i>identifier map</i> is reset and the <i>counter</i> is initialized
        to <code>0</code>.</p>

      <ol class="algorithm">
        <li>Initialize <i>node map</i> to a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> consisting of
          a single member whose key is <code>@default</code> and whose value is
          an empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>.</li>
        <li>Perform the <a href="#node-map-generation">Node Map Generation algorithm</a>, passing
          <i>element</i> and <i>node map</i>.</li>
        <li>Initialize <i>default graph</i> to the value of the <code>@default</code>
          member of <i>node map</i>, which is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> representing
          the <a class="tref internalDFN" title="default-graph" href="#dfn-default-graph">default graph</a>.</li>
        <li>For each key-value pair <i>graph name</i>-<i>graph</i> in <i>node map</i>
          where <i>graph name</i> is not <code>@default</code>,  perform the following steps:
          <ol class="algorithm">
            <li>If <i>default graph</i> does not have a <i>graph name</i> member, create
              one and initialize its value to a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> consisting of an
              <code>@id</code> member whose value is set to <i>graph name</i>.</li>
            <li>Reference the value associated with the <i>graph name</i> member in
              <i>default graph</i> using the variable <i>entry</i>.</li>
            <li>Add an <code>@graph</code> member to <i>entry</i> and set it to an
              empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
            <li>For each <i>id</i>-<i>node</i> pair in <i>graph</i> ordered by <i>id</i>,
              add <i>node</i> to the <code>@graph</code> member of <i>entry</i>,
              unless the only member of <i>node</i> is <code>@id</code>.</li>
          </ol>
        </li>
        <li>Initialize an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a> <i>flattened</i>.</li>
        <li>For each <i>id</i>-<i>node</i> pair in <i>default graph</i> ordered by <i>id</i>,
          add <i>node</i> to <i>flattened</i>,
          unless the only member of <i>node</i> is <code>@id</code>.</li>
        <li>If <i>context</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, return <i>flattened</i>.</li>
        <li>Otherwise, return the result of compacting <i>flattened</i> according the
          <a href="#compaction-algorithm">Compaction algorithm</a> passing <i>context</i>
          ensuring that the compaction result has only the <code>@graph</code> keyword (or its alias)
          at the top-level other than <code>@context</code>, even if the context is empty or if there is only one element to
          put in the <code>@graph</code> <a class="tref internalDFN" title="array" href="#dfn-array">array</a>. This ensures that the returned
          document has a deterministic structure.</li>
      </ol>
    </section>
  </section> <!-- end of Flattening Algorithm -->

  <section id="node-map-generation">
    <h3 aria-level="2" role="heading" id="h3_node-map-generation"><span class="secno">9.2 </span>Node Map Generation</h3>

    <p>This algorithm creates a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> <i>node map</i> holding an indexed
      representation of the <a class="tref internalDFN" title="graph" href="#dfn-graph">graphs</a> and <a class="tref internalDFN" title="node" href="#dfn-node">nodes</a>
      represented in the passed expanded document. All <a class="tref internalDFN" title="node" href="#dfn-node">nodes</a> that are not
      uniquely identified by an <abbr title="Internationalized Resource Identifier">IRI</abbr> get assigned a (new) <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>.
      The resulting <i>node map</i> will have a member for every graph in the document whose
      value is another object with a member for every <a class="tref internalDFN" title="node" href="#dfn-node">node</a> represented in the document.
      The default graph is stored under the <code>@default</code> member, all other graphs are
      stored under their <a class="tref internalDFN" title="graph-name" href="#dfn-graph-name">graph name</a>.</p>

    <section class="informative">
      <h4 id="overview-11" aria-level="3" role="heading">Overview</h4><p><em>This section is non-normative.</em></p>

      <p>The algorithm recursively runs over an expanded JSON-LD document to
        collect all <a class="tref internalDFN" title="property" href="#dfn-property">properties</a> of a <a class="tref internalDFN" title="node" href="#dfn-node">node</a>
        in a single <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>. The algorithm constructs a
        <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> <i>node map</i> whose keys represent the
        <a class="tref internalDFN" title="graph-name" href="#dfn-graph-name">graph names</a> used in the document
        (the <a class="tref internalDFN" title="default-graph" href="#dfn-default-graph">default graph</a> is stored under the key <code>@default</code>)
        and whose associated values are <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON objects</a>
        which index the <a class="tref internalDFN" title="node" href="#dfn-node">nodes</a> in the
        <a class="tref internalDFN" title="graph" href="#dfn-graph">graph</a>. If a
        <a class="tref internalDFN" title="property" href="#dfn-property">property's</a> value is a <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a>,
        it is replaced by a <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a> consisting of only an
        <code>@id</code> member. If a <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a> has no <code>@id</code>
        member or it is identified by a <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>,
        a new <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a> is generated. This relabeling
        of <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a> is
        also done for <a class="tref internalDFN" title="property" href="#dfn-property">properties</a> and values of
        <code>@type</code>.</p>
    </section>

    <section>
      <h4 id="algorithm-11" aria-level="3" role="heading">Algorithm</h4>

      <p>The algorithm takes as input an expanded JSON-LD document <i>element</i> and a reference to
        a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> <i>node map</i>. Furthermore it has the optional parameters
        <a class="tref internalDFN" title="active-graph" href="#dfn-active-graph">active graph</a> (which defaults to <code>@default</code>), an <a class="tref internalDFN" title="active-subject" href="#dfn-active-subject">active subject</a>,
        <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and a reference to a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> <i>list</i>. If
        not passed, <a class="tref internalDFN" title="active-subject" href="#dfn-active-subject">active subject</a>, <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and <i>list</i> are
        set to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</p>

      <ol class="algorithm">
        <li>If <i>element</i> is an array, process each <i>item</i> in <i>element</i>
          as follows and then return:
          <ol class="algorithm">
            <li>Run this algorithm recursively by passing <i>item</i> for <i>element</i>,
              <i>node map</i>, <a class="tref internalDFN" title="active-graph" href="#dfn-active-graph">active graph</a>, <a class="tref internalDFN" title="active-subject" href="#dfn-active-subject">active subject</a>,
              <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and <i>list</i>.</li>
          </ol>
        </li>
        <li>Otherwise <i>element</i> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>. Reference the
          <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> which is the value of the <a class="tref internalDFN" title="active-graph" href="#dfn-active-graph">active graph</a>
          member of <i>node map</i> using the variable <i>graph</i>. If the
          <a class="tref internalDFN" title="active-subject" href="#dfn-active-subject">active subject</a> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set <i>node</i> to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>
          otherwise reference the <a class="tref internalDFN" title="active-subject" href="#dfn-active-subject">active subject</a> member of <i>graph</i> using the
          variable <i>node</i>.</li>
        <li>If <i>element</i> has an <code>@type</code> member, perform for each
          <i>item</i> the following steps:
          <ol class="algorithm">
            <li>If <i>item</i> is a <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>, replace it with a newly
              <a href="#generate-blank-node-identifier">generated blank node identifier</a>
              passing <i>item</i> for <i>identifier</i>.</li>
          </ol>
        </li>
        <li>If <i>element</i> has an <code>@value</code> member, perform the following steps:
          <ol class="algorithm">
            <li>If <i>list</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>:
              <ol class="algorithm">
                <li>If <i>node</i> does not have an <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> member,
                  create one and initialize its value to an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>
                  containing <i>element</i>.</li>
                <li>Otherwise, compare <i>element</i> against every item in the
                  <a class="tref internalDFN" title="array" href="#dfn-array">array</a> associated with the <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>
                  member of <i>node</i>. If there is no item equivalent to <i>element</i>,
                  append <i>element</i> to the <a class="tref internalDFN" title="array" href="#dfn-array">array</a>. Two
                  <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON objects</a> are considered
                  equal if they have equivalent key-value pairs.</li>
              </ol>
            </li>
            <li>Otherwise, append <i>element</i> to the <code>@list</code> member of <i>list</i>.</li>
          </ol>
        </li>
        <li>Otherwise, if <i>element</i> has an <code>@list</code> member, perform
          the following steps:
          <ol class="algorithm">
            <li>Initialize a new <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> <i>result</i> consisting of a single member
              <code>@list</code> whose value is initialized to an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
            <li>Recursively call this algorithm passing the value of <i>element's</i>
              <code>@list</code> member for <i>element</i>, <a class="tref internalDFN" title="active-graph" href="#dfn-active-graph">active graph</a>,
              <a class="tref internalDFN" title="active-subject" href="#dfn-active-subject">active subject</a>, <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and
              <i>result</i> for <i>list</i>.</li>
            <li>Append <i>result</i> to the value of the <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> member
              of <i>node</i>.</li>
          </ol>
        </li>
        <li>Otherwise <i>element</i> is a <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a>, perform
          the following steps:
          <ol class="algorithm">
            <li>If <i>element</i> has an <code>@id</code> member, set <i>id</i>
              to its value and remove the member from <i>element</i>. If <i>id</i>
              is a <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>, replace it with a newly
              <a href="#generate-blank-node-identifier">generated blank node identifier</a>
              passing <i>id</i> for <i>identifier</i>.</li>
            <li>Otherwise, set <i>id</i> to the result of the
              <a href="#generate-blank-node-identifier">Generate Blank Node Identifier algorithm</a>
              passing <a class="tref internalDFN" title="null" href="#dfn-null">null</a> for <i>identifier</i>.</li>
            <li>If <i>graph</i> does not contain a member <i>id</i>, create one and initialize
              its value to a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> consisting of a single member <code>@id</code> whose
              value is <i>id</i>.</li>
            <li>If <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> is not <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, perform the following steps:
              <ol class="algorithm">
                <li>Create a new <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> <i>reference</i> consisting of a single member
                  <code>@id</code> whose value is <i>id</i>.</li>
                <li>If <i>list</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>:
                  <ol class="algorithm">
                    <li>If <i>node</i> does not have an <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> member,
                      create one and initialize its value to an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>
                      containing <i>reference</i>.</li>
                    <li>Otherwise, compare <i>reference</i> against every item in the
                      <a class="tref internalDFN" title="array" href="#dfn-array">array</a> associated with the <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>
                      member of <i>node</i>. If there is no item equivalent to <i>reference</i>,
                      append <i>reference</i> to the <a class="tref internalDFN" title="array" href="#dfn-array">array</a>. Two
                      <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON objects</a> are considered
                      equal if they have equivalent key-value pairs.</li>
                  </ol>
                </li>
                <li>Otherwise, append <i>element</i> to the <code>@list</code> member of <i>list</i>.</li>
              </ol>
            </li>
            <li>Reference the value of the <i>id</i> member of <i>graph</i> using the
              variable <i>node</i>.</li>
            <li>If <i>element</i> has an <code>@type</code> key, append
              each item of its associated <a class="tref internalDFN" title="array" href="#dfn-array">array</a> to the
              <a class="tref internalDFN" title="array" href="#dfn-array">array</a> associated with the <code>@type</code> key of
              <i>node</i> unless it is already in that <a class="tref internalDFN" title="array" href="#dfn-array">array</a>. Finally
              remove the <code>@type</code> member from <i>element</i>.</li>
            <li>If <i>element</i> has an <code>@index</code> member, set the <code>@index</code>
              member of <i>node</i> to its value. If <a class="tref internalDFN" title="node" href="#dfn-node">node</a> has already an
              <code>@index</code> member with a different value, a
              <code class="error"><a href="#idl-def-JsonLdErrorCode.conflicting-indexes">conflicting indexes</a></code>
              error has been detected and processing is aborted. Otherwise, continue by
              removing the <code>@index</code> member from <i>element</i>.</li>
            <li>If <i>element</i> has an <code>@reverse</code> member:
              <ol class="algorithm">
                <li>Create a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> <i>referenced node</i> with a single member <code>@id</code> whose
                  value is <i>id</i>.</li>
                <li>Set <i>reverse map</i> to the value of the <code>@reverse</code> member of
                  <i>element</i>.</li>
                <li>For each key-value pair <i>property</i>-<i>values</i> in <i>reverse map</i>:
                  <ol class="algorithm">
                    <li>For each <i>value</i> of <i>values</i>:
                      <ol class="algorithm">
                        <li>If <i>value</i> has a <i>property</i> member, append <i>referenced node</i> to
                          its value; otherwise create a <i>property</i> member whose value is an
                          <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing <i>referenced node</i>.</li>
                        <li>Recursively invoke this algorithm passing <i>value</i> for
                          <i>element</i>, <i>node map</i>, and <a class="tref internalDFN" title="active-graph" href="#dfn-active-graph">active graph</a>.</li>
                      </ol>
                    </li>
                  </ol>
                </li>
                <li>Remove the <code>@reverse</code> member from <i>element</i>.</li>
              </ol>
            </li>
            <li>If <i>element</i> has an <code>@graph</code> member, recursively invoke this
              algorithm passing the value of the <code>@graph</code> member for <i>element</i>,
              <i>node map</i>, and <i>id</i> for <a class="tref internalDFN" title="active-graph" href="#dfn-active-graph">active graph</a> before removing
              the <code>@graph</code> member from <i>element</i>.</li>
            <li>Finally, for each key-value pair <i>property</i>-<i>value</i> in <i>element</i> ordered by
              <i>property</i> perform the following steps:
              <ol class="algorithm">
                <li>If <i>property</i> is a <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>, replace it with a newly
                  <a href="#generate-blank-node-identifier">generated blank node identifier</a>
                  passing <i>property</i> for <i>identifier</i>.</li>
                <li>If <i>node</i> does not have a <i>property</i> member, create one and initialize
                  its value to an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
                <li>Recursively invoke this algorithm passing <i>value</i> for <i>element</i>,
                  <i>node map</i>, <a class="tref internalDFN" title="active-graph" href="#dfn-active-graph">active graph</a>, <i>id</i> for <a class="tref internalDFN" title="active-subject" href="#dfn-active-subject">active subject</a>,
                  and <i>property</i> for <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>.</li>
              </ol>
            </li>
          </ol>
        </li>
      </ol>
    </section>
  </section> <!-- end of Node Map Generation -->

  <section id="generate-blank-node-identifier">
    <h3 aria-level="2" role="heading" id="h3_generate-blank-node-identifier"><span class="secno">9.3 </span>Generate Blank Node Identifier</h3>

    <p>This algorithm is used to generate new
      <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a> or to
      relabel an existing <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a> to avoid collision
      by the introduction of new ones.</p>

    <section class="informative">
      <h4 id="overview-12" aria-level="3" role="heading">Overview</h4><p><em>This section is non-normative.</em></p>

      <p>The simplest case is if there exists already a <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>
        in the <i>identifier map</i> for the passed <i>identifier</i>, in which
        case it is simply returned. Otherwise, a new <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>
        is generated by concatenating the string <code>_:b</code> and the
        <i>counter</i>. If the passed <i>identifier</i> is not <a class="tref internalDFN" title="null" href="#dfn-null">null</a>,
        an entry is created in the <i>identifier map</i> associating the
        <i>identifier</i> with the <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>. Finally,
        the <i>counter</i> is increased by one and the new
        <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a> is returned.</p>
    </section>

    <section>
      <h4 id="algorithm-12" aria-level="3" role="heading">Algorithm</h4>

      <p>The algorithm takes a single input variable <i>identifier</i> which may
        be <a class="tref internalDFN" title="null" href="#dfn-null">null</a>. Between its executions, the algorithm needs to
        keep an <i>identifier map</i> to relabel existing
        <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a>
        consistently and a <i>counter</i> to generate new
        <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a>. The
        <i>counter</i> is initialized to <code>0</code> by default.</p>

      <ol class="algorithm">
        <li>If <i>identifier</i> is not <a class="tref internalDFN" title="null" href="#dfn-null">null</a> and has an entry in the
          <i>identifier map</i>, return the mapped identifier.</li>
        <li>Otherwise, generate a new <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a> by concatenating
          the string <code>_:b</code> and <i>counter</i>.</li>
        <li>Increment <i>counter</i> by <code>1</code>.</li>
        <li>If <i>identifier</i> is not <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, create a new entry
          for <i>identifier</i> in <i>identifier map</i> and set its value
          to the new <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>.</li>
        <li>Return the new <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>.</li>
      </ol>
    </section>
  </section> <!-- end of Generate Blank Node Identifier -->
</section> <!-- end of Flattening section -->


<section id="rdf-serialization-deserialization-algorithms">
  <!--OddPage--><h2 aria-level="1" role="heading" id="h2_rdf-serialization-deserialization-algorithms"><span class="secno">10. </span>RDF Serialization/Deserialization Algorithms</h2>

  <p>This section describes algorithms to deserialize a JSON-LD document to an
    <a class="tref internalDFN" title="rdf-dataset" href="#dfn-rdf-dataset">RDF dataset</a> and vice versa. The algorithms are designed for in-memory
    implementations with random access to <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> elements.</p>

  <p>Throughout this section, the following vocabulary
    <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefixes</a> are used in
    <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact IRIs</a>:</p>

  <table class="simple">
    <thead>
      <tr><th>Prefix</th>
      <th><abbr title="Internationalized Resource Identifier">IRI</abbr></th>
    </tr></thead>
    <tbody>
      <tr>
        <td>rdf</td>
        <td>http://www.w3.org/1999/02/22-rdf-syntax-ns#</td>
      </tr>
      <tr>
        <td>rdfs</td>
        <td> http://www.w3.org/2000/01/rdf-schema#</td>
      </tr>
      <tr>
        <td>xsd</td>
        <td>http://www.w3.org/2001/XMLSchema#</td>
      </tr>
    </tbody>
  </table>

  <section id="deserialize-json-ld-to-rdf-algorithm">
    <h3 aria-level="2" role="heading" id="h3_deserialize-json-ld-to-rdf-algorithm"><span class="secno">10.1 </span>Deserialize JSON-LD to RDF algorithm</h3>

    <p>This algorithm deserializes a JSON-LD document to an <a class="tref internalDFN" title="rdf-dataset" href="#dfn-rdf-dataset">RDF dataset</a>.
      Please note that RDF does not allow a <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank node</a> to be used
      as a <a class="tref internalDFN" title="property" href="#dfn-property">property</a>, while JSON-LD does.  Therefore, by default
      RDF triples that would have contained blank nodes as properties are
      discarded when interpreting JSON-LD as RDF.</p>

    <div class="issue atrisk"><div class="issue-title" aria-level="3" role="heading" id="h_issue_2"><a href="https://www.w3.org/2011/rdf-wg/wiki/JSON-LD_Features_at_Risk#3"><span>Feature at Risk 3</span></a>: Allow blank nodes to be used as properties</div><div class="atrisk" id="at-risk-3">
      <p class="atrisk-head">Note: This feature is
        <a href="http://www.w3.org/2005/10/Process-20051014/tr#cfi">"at risk"</a> and
        may be removed from this specification based on feedback. Please send feedback to
        <a href="mailto:public-rdf-comments@w3.org">public-rdf-comments@w3.org</a>.
        For the current status see
        <a href="http://www.w3.org/2011/rdf-wg/wiki/JSON-LD_Features_at_Risk">features "at risk" in JSON-LD 1.0</a></p>
      <p>RDF graphs do not allow <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank nodes</a> to be used
        as an <a class="tref internalDFN" title="rdf-predicate" href="#dfn-rdf-predicate">RDF predicate</a>, while JSON-LD does.
        Unless the <i>produce generalized RDF</i> flag is set, this algorithm will exclude
        triples including a <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank node</a> <a class="tref internalDFN" title="rdf-predicate" href="#dfn-rdf-predicate">RDF predicate</a>.</p>
    </div></div>

    <section class="informative">
      <h4 id="overview-13" aria-level="3" role="heading">Overview</h4><p><em>This section is non-normative.</em></p>

      <p>The JSON-LD document is expanded and converted to a <i>node map</i> using the
        <a href="#node-map-generation">Node Map Generation algorithm</a>.
        This allows each graph represented within the document to be
        extracted and flattened, making it easier to process each
        <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a>. Each graph from the <i>node map</i>
        is processed to extract <a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">RDF triples</a>,
        to which any (non-default) graph name is applied to create an
        <a class="tref internalDFN" title="rdf-dataset" href="#dfn-rdf-dataset">RDF dataset</a>. Each <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a> in the
        <i>node map</i> has an <code>@id</code> member which corresponds to the
        <a class="tref internalDFN" title="rdf-subject" href="#dfn-rdf-subject">RDF subject</a>, the other members
        represent <a class="tref internalDFN" title="rdf-predicate" href="#dfn-rdf-predicate">RDF predicates</a>. Each
        member value is either an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> or
        <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a> or can be transformed to an
        <a class="tref externalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">RDF literal</a>
        to generate an <a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">RDF triple</a>. <a class="tref internalDFN" title="list" href="#dfn-list">Lists</a>
        are transformed into an
        <a class="tref externalDFN" title="rdf-collection" href="http://www.w3.org/TR/rdf-schema/#ch_collectionvocab">RDF Collection</a>
        using the <a href="#list-to-rdf-conversion">List to RDF Conversion algorithm.</a></p>
    </section>

    <section>
      <h4 id="algorithm-13" aria-level="3" role="heading">Algorithm</h4>

      <p>The algorithm takes a JSON-LD document <i>element</i> and returns an
        <a class="tref internalDFN" title="rdf-dataset" href="#dfn-rdf-dataset">RDF dataset</a>. Unless the <i>produce generalized RDF</i> flag
        is set to <a class="tref internalDFN" title="true" href="#dfn-true">true</a>, <a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">RDF triples</a>
        containing a <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank node</a> <a class="tref internalDFN" title="rdf-predicate" href="#dfn-rdf-predicate">predicate</a>
        are excluded from output.</p>

      <p>This algorithm generates new <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a>
        and relabels existing <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a>.
        The used <a href="#generate-blank-node-identifier">Generate Blank Node Identifier algorithm</a>
        keeps an <i>identifier map</i> and a <i>counter</i> to ensure consistent
        relabeling and avoid collisions. Thus, before this algorithm is run,
        the <i>identifier map</i> is reset and the <i>counter</i> is initialized
        to <code>0</code>.</p>

      <ol class="algorithm">
        <li>Expand <i>element</i> according to the
          <a href="#expansion-algorithm">Expansion algorithm</a>.</li>
        <li>Generate a <i>node map</i> according to the
          <a href="#node-map-generation">Node Map Generation algorithm</a>.</li>
        <li>Initialize an empty <a class="tref internalDFN" title="rdf-dataset" href="#dfn-rdf-dataset">RDF dataset</a> <i>dataset</i>.</li>
        <li>For each <i>graph name</i> and <i>graph</i> in <i>node map</i>
          ordered by <i>graph name</i>:
          <ol class="algorithm">
            <li>If <i>graph name</i> is a <a class="tref internalDFN" title="relative-iri" href="#dfn-relative-iri">relative <abbr title="Internationalized Resource Identifier">IRI</abbr></a>, continue
              with the next <i>graph name</i>-<i>graph</i> pair.</li>
            <li>Initialize <i>triples</i> as an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
            <li>For each <i>subject</i> and <i>node</i> in <i>graph</i> ordered
              by <i>subject</i>:
              <ol class="algorithm">
                <li>If <i>subject</i> is a <a class="tref internalDFN" title="relative-iri" href="#dfn-relative-iri">relative <abbr title="Internationalized Resource Identifier">IRI</abbr></a>, continue
                  with the next <i>subject</i>-<i>node</i> pair.</li>
                <li>For each <i>property</i> and <i>values</i> in <i>node</i>
                  ordered by <i>property</i>:
                  <ol class="algorithm">
                    <li>If <i>property</i> is <code>@type</code>, then for each
                      <i>type</i> in <i>values</i>, append a <a class="tref internalDFN" title="triple" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-triple">triple</a>
                      composed of <i>subject</i>, <code>rdf:type</code>,
                      and <i>type</i> to <i>triples</i>.</li>
                    <li>Otherwise, if <i>property</i> is a <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a>
                      continue with the next <i>property</i>-<i>values</i> pair.</li>
                    <li>Otherwise, if <i>property</i> is a <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a> and
                      the <i>produce generalized RDF</i> flag is not <a class="tref internalDFN" title="true" href="#dfn-true">true</a>,
                      continue with the next <i>property</i>-<i>values</i> pair.</li>
                    <li>Otherwise, if <i>property</i> is a <a class="tref internalDFN" title="relative-iri" href="#dfn-relative-iri">relative <abbr title="Internationalized Resource Identifier">IRI</abbr></a>,
                      continue with the next <i>property</i>-<i>values</i> pair.</li>
                    <li>Otherwise, <i>property</i> is an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a> or
                      <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>. For each <i>item</i>
                      in <i>values</i>:
                      <ol class="algorithm">
                        <li>If <i>item</i> is a <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a>, initialize
                          <i>list triples</i> as an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a> and
                          <i>list head</i> to the result of the <a href="#list-to-rdf-conversion">List Conversion algorithm</a>, passing
                          the value associated with the <code>@list</code> key from
                          <i>item</i> and <i>list triples</i>. Append first a
                          <a class="tref internalDFN" title="triple" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-triple">triple</a> composed of <i>subject</i>,
                          <i>property</i>, and <i>list head</i> to <i>triples</i> and
                          finally append all <a class="tref internalDFN" title="triple" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-triple">triples</a> from
                          <i>list triples</i> to <i>triples</i>.</li>
                        <li>Otherwise, <i>item</i> is a <a class="tref internalDFN" title="value-object" href="#dfn-value-object">value object</a>
                          or a <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a>. Append a <a class="tref internalDFN" title="triple" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-triple">triple</a>
                          composed of <i>subject</i>, <i>property</i>, and
                          the result of using the
                          <a href="#object-to-rdf-conversion">Object to RDF Conversion algorithm</a>
                          passing <i>item</i> to <i>triples</i>, unless the result is
                          <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, indicating a <a class="tref internalDFN" title="relative-iri" href="#dfn-relative-iri">relative <abbr title="Internationalized Resource Identifier">IRI</abbr></a> that has
                          to be ignored.</li>
                      </ol>
                    </li>
                  </ol>
                </li>
              </ol>
            </li>
            <li>If <i>graph name</i> is <code>@default</code>, add
              <i>triples</i> to the <a class="tref internalDFN" title="default-graph" href="#dfn-default-graph">default graph</a> in <i>dataset</i>.</li>
            <li>Otherwise, create a <a class="tref internalDFN" title="named-graph" href="#dfn-named-graph">named graph</a> in <i>dataset</i>
              composed of <i>graph name</i> and add <i>triples</i>.</li>
          </ol>
        </li>
        <li>Return <i>dataset</i>.</li>
      </ol>
    </section>
  </section> <!-- end of Deserialize JSON-LD to RDF algorithm -->

  <section id="object-to-rdf-conversion">
    <h3 aria-level="2" role="heading" id="h3_object-to-rdf-conversion"><span class="secno">10.2 </span>Object to RDF Conversion</h3>

    <p>This algorithm takes a <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a> or <a class="tref internalDFN" title="value-object" href="#dfn-value-object">value object</a>
      and transforms it into an
      <a class="tref externalDFN" title="rdf-resource" href="http://www.w3.org/TR/rdf11-concepts/#dfn-resource">RDF resource</a>
      to be used as the <a class="tref internalDFN" title="object" href="http://www.w3.org/TR/rdf11-concepts/#dfn-object">object</a> of an <a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">RDF triple</a>. If a
      <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a> containing a <a class="tref internalDFN" title="relative-iri" href="#dfn-relative-iri">relative <abbr title="Internationalized Resource Identifier">IRI</abbr></a> is passed to
      the algorithm, <a class="tref internalDFN" title="null" href="#dfn-null">null</a> is returned which then causes the resulting
      <a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">RDF triple</a> to be ignored.</p>

    <section class="informative">
      <h4 id="overview-14" aria-level="3" role="heading">Overview</h4><p><em>This section is non-normative.</em></p>

      <p><a class="tref internalDFN" title="value-object" href="#dfn-value-object">Value objects</a> are transformed to
        <a class="tref internalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">RDF literals</a> as described in
        <a class="sectionRef" href="#data-round-tripping">section 10.6 Data Round Tripping</a>
        whereas <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node objects</a> are transformed
        to <a class="tref internalDFN" title="iri" href="#dfn-iri">IRIs</a>,
        <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a>,
        or <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</p>
    </section>

    <section>
      <h4 id="algorithm-14" aria-level="3" role="heading">Algorithm</h4>

      <p>The algorithm takes as its sole argument <i>item</i> which must be
        either a <a class="tref internalDFN" title="value-object" href="#dfn-value-object">value object</a> or <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a>.</p>

      <ol class="algorithm">
        <li>If <i>item</i> is a <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a> and the value of
          its <code>@id</code> member is a <a class="tref internalDFN" title="relative-iri" href="#dfn-relative-iri">relative <abbr title="Internationalized Resource Identifier">IRI</abbr></a>, return
          <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</li>
        <li>If <i>item</i> is a <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a>, return the
          <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> or <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a> associated
          with its <code>@id</code> member.</li>
        <li>Otherwise, <i>item</i> is a <a class="tref internalDFN" title="value-object" href="#dfn-value-object">value object</a>. Initialize
          <i>value</i> to the value associated with the <code>@value</code>
          member in <i>item</i>.
        </li><li>Initialize <i>datatype</i> to the value associated with the
          <code>@type</code> member of <i>item</i> or  <a class="tref internalDFN" title="null" href="#dfn-null">null</a> if
          <i>item</i> does not have such a member.</li>
        <li>If <i>value</i> is <a class="tref internalDFN" title="true" href="#dfn-true">true</a> or
          <a class="tref internalDFN" title="false" href="#dfn-false">false</a>, set <i>value</i> to the <a class="tref internalDFN" title="string" href="#dfn-string">string</a>
          <code>true</code> or <code>false</code> which is the
          <a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">canonical lexical form</a> as described in
          <a class="sectionRef" href="#data-round-tripping">section 10.6 Data Round Tripping</a>
          If <i>datatype</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set it to
          <code>xsd:boolean</code>.</li>
        <li>Otherwise, if <i>value</i> is a <a class="tref internalDFN" title="number" href="#dfn-number">number</a> with a non-zero fractional
          part (the result of a modulo‑1 operation) or <i>value</i> is a <a class="tref internalDFN" title="number" href="#dfn-number">number</a>
          and <i>datatype</i> equals <code>xsd:double</code>, convert <i>value</i> to a
          <a class="tref internalDFN" title="string" href="#dfn-string">string</a> in <a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">canonical lexical form</a> of
          an <code>xsd:double</code> as defined in [<cite><a class="bibref" href="#bib-XMLSCHEMA11-2">XMLSCHEMA11-2</a></cite>]
          and described in
          <a class="sectionRef" href="#data-round-tripping">section 10.6 Data Round Tripping</a>.
          If <i>datatype</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set it to
          <code>xsd:double</code>.</li>
        <li>Otherwise, if <i>value</i> is a <a class="tref internalDFN" title="number" href="#dfn-number">number</a> with no non-zero
          fractional part (the result of a modulo‑1 operation) or <i>value</i>
          is a <a class="tref internalDFN" title="number" href="#dfn-number">number</a> and <i>datatype</i>
          equals <code>xsd:integer</code>, convert <i>value</i> to a
          <a class="tref internalDFN" title="string" href="#dfn-string">string</a> in <a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">canonical lexical form</a> of
          an <code>xsd:integer</code> as defined in [<cite><a class="bibref" href="#bib-XMLSCHEMA11-2">XMLSCHEMA11-2</a></cite>]
          and described in
          <a class="sectionRef" href="#data-round-tripping">section 10.6 Data Round Tripping</a>.
          If <i>datatype</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set it to
          <code>xsd:integer</code>.</li>
        <li>Otherwise, if <i>datatype</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set it to
          <code>xsd:string</code> or <code>rdf:langString</code>, depending on if
          item has an <code>@language</code> member.</li>
        <li>Initialize <i>literal</i> as an <a class="tref internalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">RDF literal</a> using
          <i>value</i> and <i>datatype</i>. If <i>item</i> has an
          <code>@language</code> member, add the value associated with the
          <code>@language</code> key as the language tag of <i>literal</i>.</li>
        <li>Return <i>literal</i>.</li>

      </ol>
    </section>
  </section> <!-- end of Object to RDF Conversion -->

  <section id="list-to-rdf-conversion">
    <h3 aria-level="2" role="heading" id="h3_list-to-rdf-conversion"><span class="secno">10.3 </span>List to RDF Conversion</h3>

    <p>List Conversion is the process of taking a <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a>
      and transforming it into an
      <a class="tref externalDFN" title="rdf-collection" href="http://www.w3.org/TR/rdf-schema/#ch_collectionvocab">RDF Collection</a>
      as defined in RDF Semantics [<cite><a class="bibref" href="#bib-RDF-MT">RDF-MT</a></cite>].</p>

    <section class="informative">
      <h4 id="overview-15" aria-level="3" role="heading">Overview</h4><p><em>This section is non-normative.</em></p>

      <p>For each element of the <a class="tref internalDFN" title="list" href="#dfn-list">list</a> a new <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>
        is allocated which is used to generate <code>rdf:first</code> and
        <code>rdf:rest</code> <a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">triples</a>. The
        algorithm returns the list head, which is either the first allocated
        <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a> or <code>rdf:nil</code> if the
        <a class="tref internalDFN" title="list" href="#dfn-list">list</a> is empty. If a list element represents a <a class="tref internalDFN" title="relative-iri" href="#dfn-relative-iri">relative <abbr title="Internationalized Resource Identifier">IRI</abbr></a>,
        the corresponding <code>rdf:first</code> triple is omitted.</p>
    </section>

    <section>
      <h4 id="algorithm-15" aria-level="3" role="heading">Algorithm</h4>

      <p>The algorithm takes two inputs: an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> <i>list</i>
        and an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a> <i>list triples</i> used for returning
        the generated <a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">triples</a>.</p>

      <ol class="algorithm">
        <li>If <i>list</i> is empty, return <code>rdf:nil</code>.</li>
        <li>Otherwise, create an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> <i>bnodes</i> composed of a
          <a href="#generate-blank-node-identifier">newly generated blank node identifier</a>
          for each entry in <i>list</i>.</li>
        <li>Initialize an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a> <i>list triples</i>.</li>
        <li>For each pair of <i>subject</i> from <i>bnodes</i> and <i>item</i> from <i>list</i>:
          <ol class="algorithm">
            <li>Initialize <i>object</i> to the result of using the
              <a href="#object-to-rdf-conversion">Object to RDF Conversion algorithm</a>
              passing <i>item</i> to <i>list triples</i>.</li>
            <li>Unless <i>object</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, append a <a class="tref internalDFN" title="triple" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-triple">triple</a>
              composed of <i>subject</i>, <code>rdf:first</code>, and <i>object</i>.</li>
            <li>Set <i>rest</i> as the next entry in <i>bnodes</i>, or if that
              does not exist, <code>rdf:nil</code>. Append a
              <a class="tref internalDFN" title="triple" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-triple">triple</a> composed of <i>subject</i>,
              <code>rdf:rest</code>, and <i>rest</i> to <i>list triples</i>.</li>
          </ol>
        </li>
        <li>Return the first <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank node</a> from <i>bnodes</i> or
          <code>rdf:nil</code> if <i>bnodes</i> is empty.</li>
      </ol>
    </section>
  </section> <!-- end of List to RDF -->

  <section id="serialize-rdf-as-json-ld-algorithm">
    <h3 aria-level="2" role="heading" id="h3_serialize-rdf-as-json-ld-algorithm"><span class="secno">10.4 </span>Serialize RDF as JSON-LD Algorithm</h3>

    <p>This algorithm serializes an <a class="tref internalDFN" title="rdf-dataset" href="#dfn-rdf-dataset">RDF dataset</a> consisting of a
      <a class="tref internalDFN" title="default-graph" href="#dfn-default-graph">default graph</a> and zero or more
      <a class="tref internalDFN" title="named-graph" href="#dfn-named-graph">named graphs</a> into a JSON-LD document.</p>

    <section class="informative">
      <h4 id="overview-16" aria-level="3" role="heading">Overview</h4><p><em>This section is non-normative.</em></p>

      <p>Iterate through each graph in the dataset, converting each
        <a class="tref internalDFN" title="rdf-collection" href="http://www.w3.org/TR/rdf-schema/#ch_collectionvocab">RDF Collection</a> into a <a class="tref internalDFN" title="list" href="#dfn-list">list</a>
        and generating a JSON-LD document in expanded form for all
        <a class="tref internalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">RDF literals</a>, <a class="tref internalDFN" title="iri" href="#dfn-iri">IRIs</a>
        and <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a>.
        If the <i>use native types</i> flag is set to <a class="tref internalDFN" title="true" href="#dfn-true">true</a>,
        <a class="tref internalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">RDF literals</a> with a
        <a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">datatype <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
        that equals <code>xsd:integer</code> or <code>xsd:double</code> are converted
        to a <a class="tref internalDFN" title="number" href="#dfn-number">JSON numbers</a> and <a class="tref internalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">RDF literals</a>
        with a <a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">datatype <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
        that equals <code>xsd:boolean</code> are converted to <a class="tref internalDFN" title="true" href="#dfn-true">true</a> or
        <a class="tref internalDFN" title="false" href="#dfn-false">false</a> based on their
        <a class="tref externalDFN" title="lexical-form" href="http://www.w3.org/TR/rdf11-concepts/#dfn-lexical-form">lexical form</a>
        as described in
        <a class="sectionRef" href="#data-round-tripping">section 10.6 Data Round Tripping</a>.</p>
    </section>

    <section>
      <h4 id="algorithm-16" aria-level="3" role="heading">Algorithm</h4>

      <p>The algorithm takes two required inputs: an <a class="tref internalDFN" title="rdf-dataset" href="#dfn-rdf-dataset">RDF dataset</a> and a flag
        <i>use native types</i> that defaults to <a class="tref internalDFN" title="false" href="#dfn-false">false</a>.</p>

      <ol class="algorithm">
        <li>Initialize <i>default graph</i> to an empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>.</li>
        <li>Initialize <i>graph map</i> to a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> consisting
          of a single member <code>@default</code> whose value references
          <i>default graph</i>.</li>
        <li>For each <i>graph</i> in <a class="tref internalDFN" title="rdf-dataset" href="#dfn-rdf-dataset">RDF dataset</a>:
          <ol class="algorithm">
            <li>If <i>graph</i> is the <a class="tref internalDFN" title="default-graph" href="#dfn-default-graph">default graph</a>,
              set <i>name</i> to <code>@default</code>, otherwise to the
              <a class="tref internalDFN" title="graph-name" href="#dfn-graph-name">graph name</a> associated with <i>graph</i>.</li>
            <li>If <i>graph map</i> has no <i>name</i> member, create one and set
              its value to an empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>.</li>
            <li>If <i>graph</i> is not the <a class="tref internalDFN" title="default-graph" href="#dfn-default-graph">default graph</a> and
              <i>default graph</i> does not have a <i>name</i> member,
              create such a member and initialize its value to a new
              <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> with a single member <code>@id</code>
              whose value is <i>name</i>.</li>
            <li>Reference the value of the <i>name</i> member in <i>graph map</i>
              using the variable <i>node map</i>.</li>
            <li>For each <a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">RDF triple</a> in <i>graph</i>
              consisting of <i>subject</i>, <i>predicate</i>, and <i>object</i>:
              <ol class="algorithm">
                <li>If <i>node map</i> does not have a <i>subject</i> member,
                  create one and initialize its value to a new <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>
                  consisting of a single member <code>@id</code> whose value is
                  set to <i>subject</i>.</li>
                <li>Reference the value of the <i>subject</i> member in <i>node map</i>
                  using the variable <i>node</i>.</li>
                <li>If <i>object</i> is an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> or <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>,
                  and <i>node map</i> does not have an <i>object</i> member,
                  create one and initialize its value to a new <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>
                  consisting of a single member <code>@id</code> whose value is
                  set to <i>object</i>.</li>
                <li>If <i>predicate</i> equals <code>rdf:type</code>, and <i>object</i>
                  is an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> or <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>,
                  append <i>object</i> to the value of the <code>@type</code>
                  member of <i>node</i>; unless such an item already exists.
                  If no such member exists, create one
                  and initialize it to an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> whose only item is
                  <i>object</i>. Finally, continue to the next
                  <a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">RDF triple</a>.</li>
                <li>Set <i>value</i> to the result of using the
                  <a href="#rdf-to-object-conversion">RDF to Object Conversion algorithm</a>,
                  passing <i>object</i> and <i>use native types</i>.</li>
                <li>If <i>node</i> does not have an <i>predicate</i> member, create one
                  and initialize its value to an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
                <li>If there is no item equivalent to <i>value</i> in the <a class="tref internalDFN" title="array" href="#dfn-array">array</a>
                  associated with the <i>predicate</i> member of <i>node</i>, append a
                  reference to <i>value</i> to the <a class="tref internalDFN" title="array" href="#dfn-array">array</a>. Two JSON objects
                  are considered equal if they have equivalent key-value pairs.</li>
                <li>If <i>object</i> is a <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a> or <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>,
                  it might represent the list node:
                  <ol class="algorithm">
                    <li>If the <i>object</i> member of <i>node map</i> has no
                      <code>usages</code> member, create one and initialize it to
                      an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
                    <li>Reference the <code>usages</code> member of the <i>object</i>
                      member of <i>node map</i> using the variable <i>usages</i>.</li>
                    <li>Append a new <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> consisting of three
                      members, <code>node</code>, <code>property</code>, and <code>value</code>
                      to the <i>usages</i> <a class="tref internalDFN" title="array" href="#dfn-array">array</a>. The <code>node</code> member
                      is set to a reference to <i>node</i>, <code>property</code> to <i>predicate</i>,
                      and <code>value</code> to a reference to <i>value</i>.</li>
                  </ol>
                </li>
              </ol>
            </li>
          </ol>
        </li>
        <li>For each <i>name</i> and <i>graph object</i> in <i>graph map</i>:
          <ol class="algorithm">
            <li>If <i>graph object</i> has no <code>rdf:nil</code> member, continue
              with the next <i>name</i>-<i>graph object</i> pair as the graph does
              not contain any lists that need to be converted.</li>
            <li>Initialize <i>nil</i> to the value of the <code>rdf:nil</code> member
              of <i>graph object</i>.</li>
            <li>For each item <i>usage</i> in the <code>usages</code> member of
              <i>nil</i>, perform the following steps:
              <ol class="algorithm">
                <li>Initialize <i>node</i> to the value of the value of the
                  <code>node</code> member of <i>usage</i>, <i>property</i> to
                  the value of the <code>property</code> member of <i>usage</i>,
                  and <i>head</i> to the value of the <code>value</code> member
                  of <i>usage</i>.</li>
                <li>Initialize two empty <a class="tref internalDFN" title="array" href="#dfn-array">arrays</a> <i>list</i>
                  and <i>list nodes</i>.</li>
                <li>While <i>property</i> equals <code>rdf:rest</code>, the value
                  associated to the <code>usages</code> member of <i>node</i> has
                  exactly 1 entry, <i>node</i> has a <code>rdf:first</code> and
                  <code>rdf:rest</code> property, both of which have as value an
                  <a class="tref internalDFN" title="array" href="#dfn-array">array</a> consisting of a single element, and <i>node</i>
                  has no other members apart from an optional <code>@type</code>
                  member whose value is an array with a single item equal to
                  <code>rdf:List</code>, <i>node</i> represents a well-formed list
                  node. Perform the following steps to traverse the list backwards
                  towards its head:
                  <ol class="algorithm">
                    <li>Append the only item of <code>rdf:first</code> member of
                      <i>node</i> to the <i>list</i> <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
                    <li>Append the value of the <code>@id</code> member of
                      <i>node</i> to the <i>list nodes</i> <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
                    <li>Initialize <i>node usage</i> to the only item of the
                      <code>usages</code> member of <i>node</i>.</li>
                    <li>Set <i>node</i> to the value of the <code>node</code> member
                      of <i>node usage</i>, <i>property</i> to the value of the
                      <code>property</code> member of <i>node usage</i>, and
                      <i>head</i> to the value of the <code>value</code> member
                      of <i>node usage</i>.</li>
                    <li>If the <code>@id</code> member of <i>node</i> is an
                      <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> instead of a <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>,
                      exit the while loop.</li>
                  </ol>
                </li>
                <li>If <i>property</i> equals <code>rdf:first</code>, i.e., the
                  detected list is nested inside another list
                  <ol class="algorithm">
                    <li>and the value of the <code>@id</code> of <i>node</i> equals
                      <code>rdf:nil</code>, i.e., the detected list is empty,
                      continue with the next <i>usage</i> item. The
                      <code>rdf:nil</code> node cannot be converted to a
                      <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a> as it would result in a list of
                      lists, which isn't supported.</li>
                    <li>Otherwise, the list consists of at least one item. We preserve the
                      head node and transform the rest of the linked list to a
                      <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a>.</li>
                    <li>Set <i>head id</i> to the value of the <code>@id</code>
                      member of <i>head</i>.</li>
                    <li>Set <i>head</i> to the value of the <i>head id</i> member of
                      <i>graph object</i> so that all it's properties can be accessed.</li>
                    <li>Then, set <i>head</i> to the only item in the value of the
                      <code>rdf:rest</code> member of <i>head</i>.</li>
                    <li>Finally, remove the last item of the <i>list</i> <a class="tref internalDFN" title="array" href="#dfn-array">array</a>
                      and the last item of the <i>list nodes</i> <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
                  </ol>
                </li>
                <li>Remove the <code>@id</code> member from <i>head</i>.</li>
                <li>Reverse the order of the <i>list</i> <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
                <li>Add a <code>@list</code> member to <i>head</i> and initialize
                  its value to the <i>list</i> <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
                <li>For each item <i>node id</i> in <i>list nodes</i>, remove the
                  <i>node id</i> member from <i>graph object</i>.</li>
              </ol>
            </li>
          </ol>
        </li>
        <li>Initialize an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a> <i>result</i>.</li>
        <li>For each <i>subject</i> and <i>node</i> in <i>default graph</i>
          ordered by <i>subject</i>:
          <ol class="algorithm">
            <li>If <i>graph map</i> has a <i>subject</i> member:
              <ol class="algorithm">
                <li>Add a <code>@graph</code> member to <i>node</i> and initialize
                  its value to an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
                <li>For each key-value pair <i>s</i>-<i>n</i> in the <i>subject</i>
                  member of <i>graph map</i> ordered by <i>s</i>, append <i>n</i>
                  to the <code>@graph</code> member of <i>node</i> after
                  removing its <code>usages</code> member, unless the only
                  remaining member of <i>n</i> is <code>@id</code>.</li>
              </ol>
            </li>
            <li>Append <i>node</i> to <i>result</i> after removing its
              <code>usages</code> member, unless the only remaining member of
              <i>node</i> is <code>@id</code>.</li>
          </ol>
        </li>
        <li>Return <i>result</i>.</li>
      </ol>
    </section>
  </section> <!-- end of Serialize RDF as JSON-LD Algorithm -->

  <section id="rdf-to-object-conversion">
    <h3 aria-level="2" role="heading" id="h3_rdf-to-object-conversion"><span class="secno">10.5 </span>RDF to Object Conversion</h3>

    <p>This algorithm transforms an RDF literal to a JSON-LD <a class="tref internalDFN" title="value-object" href="#dfn-value-object">value object</a>
      and a RDF blank node or <abbr title="Internationalized Resource Identifier">IRI</abbr> to an JSON-LD <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a>.</p>

    <section class="informative">
      <h4 id="overview-17" aria-level="3" role="heading">Overview</h4><p><em>This section is non-normative.</em></p>

      <p><a class="tref internalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">RDF literals</a> are transformed to
        <a class="tref internalDFN" title="value-object" href="#dfn-value-object">value objects</a> whereas <a class="tref internalDFN" title="iri" href="#dfn-iri">IRIs</a> and
        <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a> are
        transformed to <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node objects</a>.
        If the <i>use native types</i> flag is set to <a class="tref internalDFN" title="true" href="#dfn-true">true</a>,
        <a class="tref internalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">RDF literals</a> with a
        <a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">datatype <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
        that equals <code>xsd:integer</code> or <code>xsd:double</code> are converted
        to a <a class="tref internalDFN" title="number" href="#dfn-number">JSON numbers</a> and <a class="tref internalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">RDF literals</a>
        with a <a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">datatype <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
        that equals <code>xsd:boolean</code> are converted to <a class="tref internalDFN" title="true" href="#dfn-true">true</a> or
        <a class="tref internalDFN" title="false" href="#dfn-false">false</a> based on their
        <a class="tref externalDFN" title="lexical-form" href="http://www.w3.org/TR/rdf11-concepts/#dfn-lexical-form">lexical form</a>
        as described in
        <a class="sectionRef" href="#data-round-tripping">section 10.6 Data Round Tripping</a>.</p>
    </section>

    <section>
      <h4 id="algorithm-17" aria-level="3" role="heading">Algorithm</h4>

      <p>This algorithm takes two required inputs: a <i>value</i> to be converted
        to a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> and a flag <i>use native types</i>.</p>

      <ol class="algorithm">
        <li>If <i>value</i> is an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> or a
          <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>, return a new <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>
          consisting of a single member <code>@id</code> whose value is set to
          <i>value</i>.</li>
        <li>Otherwise <i>value</i> is an
          <a class="tref externalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">RDF literal</a>:
          <ol class="algorithm">
            <li>Initialize a new empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> result.</li>
            <li>Initialize <i>converted value</i> to <i>value</i>.</li>
            <li>Initialize <i>type</i> to <a class="tref internalDFN" title="null" href="#dfn-null">null</a></li>
            <li>If <i>use native types</i> is <a class="tref internalDFN" title="true" href="#dfn-true">true</a>
              <ol class="algorithm">
                <li>If the
                  <a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">datatype <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
                  of <i>value</i> equals <code>xsd:string</code>, set
                  <i>converted value</i> to the
                  <a class="tref externalDFN" title="lexical-form" href="http://www.w3.org/TR/rdf11-concepts/#dfn-lexical-form">lexical form</a>
                  of <i>value</i>.</li>
                <li>Otherwise, if the
                  <a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">datatype <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
                  of <i>value</i> equals <code>xsd:boolean</code>, set
                  <i>converted value</i> to <a class="tref internalDFN" title="true" href="#dfn-true">true</a> if the
                  <a class="tref externalDFN" title="lexical-form" href="http://www.w3.org/TR/rdf11-concepts/#dfn-lexical-form">lexical form</a>
                  of <i>value</i> matches <code>true</code>, or <a class="tref internalDFN" title="false" href="#dfn-false">false</a>
                  if it matches <code>false</code>. If it matches neither,
                  set <i>type</i> to <code>xsd:boolean</code>.</li>
                <li>Otherwise, if the
                  <a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">datatype <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
                  of <i>value</i> equals <code>xsd:integer</code> or
                  <code>xsd:double</code> and its
                  <a class="tref externalDFN" title="lexical-form" href="http://www.w3.org/TR/rdf11-concepts/#dfn-lexical-form">lexical form</a>
                  is a valid <code>xsd:integer</code> or <code>xsd:double</code>
                  according [<cite><a class="bibref" href="#bib-XMLSCHEMA11-2">XMLSCHEMA11-2</a></cite>], set <i>converted value</i>
                  to the result of converting the
                  <a class="tref externalDFN" title="lexical-form" href="http://www.w3.org/TR/rdf11-concepts/#dfn-lexical-form">lexical form</a>
                  to a JSON <a class="tref internalDFN" title="number" href="#dfn-number">number</a>.</li>
              </ol>
            </li>
            <li>Otherwise, if <i>value</i> is a
              <a class="tref externalDFN" title="language-tagged-string" href="http://www.w3.org/TR/rdf11-concepts/#dfn-language-tagged-string">language-tagged string</a>
              add a member <code>@language</code> to <i>result</i> and set its value to the
              <a class="tref externalDFN" title="language-tag" href="http://www.w3.org/TR/rdf11-concepts/#dfn-language-tag">language tag</a>
              of <i>value</i>.</li>
            <li>Otherwise, set <i>type</i> to the
              <a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">datatype <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
              of <i>value</i>, unless it equals <code>xsd:string</code> which is ignored.</li>
            <li>Add a member <code>@value</code> to <i>result</i> whose value
              is set to <i>converted value</i>.</li>
            <li>If <i>type</i> is not <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, add a member <code>@type</code>
              to <i>result</i> whose value is set to <i>type</i>.</li>
            <li>Return <i>result</i>.</li>
          </ol>
        </li>
      </ol>
    </section>
  </section>

  <section id="data-round-tripping">
    <h3 aria-level="2" role="heading" id="h3_data-round-tripping"><span class="secno">10.6 </span>Data Round Tripping</h3>

    <p>When <a href="#deserialize-json-ld-to-rdf-algorithm">deserializing JSON-LD to RDF</a>
      JSON-native <a class="tref internalDFN" title="number" href="#dfn-number">numbers</a> are automatically
      type-coerced to <code>xsd:integer</code> or <code>xsd:double</code>
      depending on whether the <a class="tref internalDFN" title="number" href="#dfn-number">number</a> has a non-zero fractional part
      or not (the result of a modulo‑1 operation), the boolean values
      <a class="tref internalDFN" title="true" href="#dfn-true">true</a> and <a class="tref internalDFN" title="false" href="#dfn-false">false</a> are coerced to <code>xsd:boolean</code>,
      and <a class="tref internalDFN" title="string" href="#dfn-string">strings</a> are coerced to <code>xsd:string</code>.
      The numeric or boolean values themselves are converted to
      <dfn title="canonical-lexical-form" id="dfn-canonical-lexical-form">canonical lexical form</dfn>, i.e., a deterministic string
      representation as defined in [<cite><a class="bibref" href="#bib-XMLSCHEMA11-2">XMLSCHEMA11-2</a></cite>].</p>

    <p>The <a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">canonical lexical form</a> of an <em>integer</em>, i.e., a
      <a class="tref internalDFN" title="number" href="#dfn-number">number</a> with no non-zero fractional part or a <a class="tref internalDFN" title="number" href="#dfn-number">number</a>
      coerced to <code>xsd:integer</code>, is a finite-length sequence of decimal
      digits (<code>0-9</code>) with an optional leading minus sign; leading
      zeros are prohibited. In JavaScript, implementers can use the following
      snippet of code to convert an integer to
      <a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">canonical lexical form</a>:</p>

    <div class="example"><div class="example-title"><span>Example 12</span>: Sample integer serialization implementation in JavaScript</div><pre class="example">(value).toFixed(0).toString()</pre></div>

    <p>The <a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">canonical lexical form</a> of a <em>double</em>, i.e., a
      <a class="tref internalDFN" title="number" href="#dfn-number">number</a> with a non-zero fractional part or a <a class="tref internalDFN" title="number" href="#dfn-number">number</a>
      coerced to <code>xsd:double</code>, consists of a mantissa followed by the
      character <code>E</code>, followed by an exponent. The mantissa is a
      decimal number and the exponent is an integer. Leading zeros and a
      preceding plus sign (<code>+</code>) are prohibited in the exponent.
      If the exponent is zero, it is indicated by <code>E0</code>. For the
      mantissa, the preceding optional plus sign is prohibited and the
      decimal point is required. Leading and trailing zeros are prohibited
      subject to the following: number representations must be normalized
      such that there is a single digit which is non-zero to the left of
      the decimal point and at least a single digit to the right of the
      decimal point unless the value being represented is zero. The
      canonical representation for zero is <code>0.0E0</code>.
      <code>xsd:double</code>'s value space is defined by the IEEE
      double-precision 64-bit floating point type [<cite><a class="bibref" href="#bib-IEEE-754-1985">IEEE-754-1985</a></cite>] whereas
      the value space of JSON <a class="tref internalDFN" title="number" href="#dfn-number">numbers</a> is not
      specified; when deserializing JSON-LD to RDF the mantissa is rounded to
      15&nbsp;digits after the decimal point. In JavaScript, implementers
      can use the following snippet of code to convert a double to
      <a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">canonical lexical form</a>:</p>

    <div class="example"><div class="example-title"><span>Example 13</span>: Sample floating point number serialization implementation in JavaScript</div><pre class="example">(value).toExponential(15).replace(/(\d)0*e\+?/,'$1E')</pre></div>

    <p>The <a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">canonical lexical form</a> of the <em>boolean</em>
      values <a class="tref internalDFN" title="true" href="#dfn-true">true</a> and <a class="tref internalDFN" title="false" href="#dfn-false">false</a> are the strings
      <code>true</code> and <code>false</code>.</p>

    <p>When JSON-native <a class="tref internalDFN" title="number" href="#dfn-number">numbers</a> are deserialized
      to RDF, lossless data round-tripping cannot be guaranteed, as rounding
      errors might occur. When
      <a href="#serialize-rdf-as-json-ld-algorithm">serializing RDF as JSON-LD</a>,
      similar rounding errors might occur. Furthermore, the datatype or the lexical
      representation might be lost. An <code>xsd:double</code> with a value
      of <code>2.0</code> will, e.g., result in an <code>xsd:integer</code>
      with a value of <code>2</code> in <a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">canonical lexical form</a>
      when converted from RDF to JSON-LD and back to RDF. It is important
      to highlight that in practice it might be impossible to losslessly
      convert an <code>xsd:integer</code> to a <a class="tref internalDFN" title="number" href="#dfn-number">number</a> because
      its value space is not limited. While the JSON specification [<cite><a class="bibref" href="#bib-RFC4627">RFC4627</a></cite>]
      does not limit the value space of <a class="tref internalDFN" title="number" href="#dfn-number">numbers</a>
      either, concrete implementations typically do have a limited value
      space.</p>

    <p>To ensure lossless round-tripping the
      <a href="#serialize-rdf-as-json-ld-algorithm">Serialize RDF as JSON-LD algorithm</a>
      specifies a <i>use native types</i> flag which controls whether
      <a class="tref externalDFN" title="rdf-literals" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">RDF literals</a>
      with a <a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">datatype <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
      equal to <code>xsd:integer</code>, <code>xsd:double</code>, or
      <code>xsd:boolean</code> are converted to their JSON-native
      counterparts. If the <i>use native types</i> flag is set to
      <a class="tref internalDFN" title="false" href="#dfn-false">false</a>, all literals remain in their original string
      representation.</p>

    <p>Some JSON serializers, such as PHP's native implementation in some versions,
      backslash-escape the forward slash character. For example, the value
      <code>http://example.com/</code> would be serialized as <code>http:\/\/example.com\/</code>.
      This is problematic as other JSON parsers might not understand those escaping characters.
      There is no need to backslash-escape forward slashes in JSON-LD. To aid
      interoperability between JSON-LD processors, forward slashes <em class="rfc2119" title="MUST NOT">MUST NOT</em> be
      backslash-escaped.</p>
  </section> <!-- end of Data Round Tripping -->
</section>


<section id="the-application-programming-interface">
  <!--OddPage--><h2 aria-level="1" role="heading" id="h2_the-application-programming-interface"><span class="secno">11. </span>The Application Programming Interface</h2>

  <p>This API provides a clean mechanism that enables developers to convert
    JSON-LD data into a variety of output formats that are often easier to
    work with. A conformant <a class="tref internalDFN" title="json-ld-api-implementation" href="#dfn-json-ld-api-implementation">JSON-LD API Implementation</a> <em class="rfc2119" title="MUST">MUST</em>
    implement the entirety of the following API.</p>

  <p>The JSON-LD API uses <a class="tref internalDFN" title="promise" href="#dfn-promise">Promises</a> to represent
    the result of the various asynchronous operations.
    <dfn title="promise" id="dfn-promise">Promises</dfn> are defined in
    <cite><a href="http://dom.spec.whatwg.org/#promises">section&nbsp;4 Promises</a></cite>
    of [<cite><a class="bibref" href="#bib-DOM-WHATWG">DOM-WHATWG</a></cite>].</p>

    <div class="issue atrisk"><div class="issue-title" aria-level="2" role="heading" id="h_issue_3"><a href="https://www.w3.org/2011/rdf-wg/wiki/JSON-LD_Features_at_Risk#8"><span>Feature at Risk 8</span></a>: Properly referencing the DOM Promises spec</div><div class="atrisk" id="at-risk-8">
      <p class="atrisk-head">Note: This feature is
        <a href="http://www.w3.org/2005/10/Process-20051014/tr#cfi">"at risk"</a> and may
        be removed or modified heavily from the feature described in this specification
        based on reviewer feedback. Please send feedback to
        <a href="mailto:public-rdf-comments@w3.org">public-rdf-comments@w3.org</a>.
        For the current status see
        <a href="http://www.w3.org/2011/rdf-wg/wiki/JSON-LD_Features_at_Risk">features "at risk" in JSON-LD 1.0</a></p>
      <p>The JSON-LD API specification currently only refers to the "Promise" interface and does not attempt to provide any details on the specific implementation of Promises. That is, it does not reference whether or not '.then()' must be specified. This is done in order to allow for some implementation flexibility in the event the DOM Promises spec changes. The editors of the WHATWG DOM specification have asserted that the Promise interface is ready to be incorporated into specifications. The issue relates to how to properly refer to a spec living in the WHATWG as a living standard as well as how to ensure that the interface provided by the spec is stable.</p>
    </div></div>

  <section id="the-jsonldprocessor-interface">
    <h3 aria-level="2" role="heading" id="h3_the-jsonldprocessor-interface"><span class="secno">11.1 </span>The <a href="#idl-def-JsonLdProcessor" class="idlType"><code>JsonLdProcessor</code></a> Interface</h3>

    <p>The <a href="#idl-def-JsonLdProcessor" class="idlType"><code>JsonLdProcessor</code></a> interface is the high-level programming structure
      that developers use to access the JSON-LD transformation methods.</p>

    <p>It is important to highlight that conformant
      <a class="tref internalDFN" title="json-ld-api-implementation" href="#dfn-json-ld-api-implementation">JSON-LD API Implementations</a>
      <em class="rfc2119" title="MUST NOT">MUST NOT</em> modify the input parameters. If an error is detected, the Promise is
      rejected passing a <a href="#idl-def-JsonLdError" class="idlType"><code>JsonLdError</code></a> with the corresponding error
      <code class="idlMemberName"><a href="#widl-JsonLdError-code">code</a></code>
      and processing is stopped.</p>

    <p>If the <code class="idlMemberName"><a href="#widl-JsonLdOptions-documentLoader">documentLoader</a></code>
      option is specified, a conformant <a class="tref internalDFN" title="json-ld-processor" href="#dfn-json-ld-processor">JSON-LD Processor</a> <em class="rfc2119" title="MUST">MUST</em> use it to dereference remote documents
      and contexts. The <code class="idlMemberName"><a href="#widl-RemoteDocument-documentUrl">documentUrl</a></code>
      in the returned <code class="idlMemberName"><a href="#idl-def-RemoteDocument">RemoteDocument</a></code>
      is used as <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a> and the
      <code class="idlMemberName"><a href="#widl-RemoteDocument-contextUrl">contextUrl</a></code>
      is used instead of looking at the HTTP Link Header directly. For the sake of simplicity, none of the algorithms
      in this document mention this directly. <a class="tref internalDFN" title="json-ld-api-implementation" href="#dfn-json-ld-api-implementation">JSON-LD API Implementations</a>
      are not required to implement the
      <code class="idlMemberName"><a href="#widl-JsonLdOptions-documentLoader">documentLoader</a></code> option.</p>

    <pre class="idl"><span class="idlInterface" id="idl-def-JsonLdProcessor">[<span class="extAttr">Constructor</span>]
interface <span class="idlInterfaceID">JsonLdProcessor</span> {
<span class="idlMethod">    <span class="idlMethType"><a href="#dfn-promise" class="internalDFN">Promise</a></span> <span class="idlMethName"><a href="#widl-JsonLdProcessor-compact-Promise-any-input-JsonLdContext-context-JsonLdOptions-options">compact</a></span> (<span class="idlParam"><span class="idlParamType"><a>any</a></span> <span class="idlParamName">input</span></span>, <span class="idlParam"><span class="idlParamType"><a href="#idl-def-JsonLdContext" class="idlType"><code>JsonLdContext</code></a></span> <span class="idlParamName">context</span></span>, <span class="idlParam">optional <span class="idlParamType"><a href="#idl-def-JsonLdOptions" class="idlType"><code>JsonLdOptions</code></a></span> <span class="idlParamName">options</span></span>);</span>
<span class="idlMethod">    <span class="idlMethType"><a href="#dfn-promise" class="internalDFN">Promise</a></span> <span class="idlMethName"><a href="#widl-JsonLdProcessor-expand-Promise-any-input-JsonLdOptions-options">expand</a></span> (<span class="idlParam"><span class="idlParamType"><a>any</a></span> <span class="idlParamName">input</span></span>, <span class="idlParam">optional <span class="idlParamType"><a href="#idl-def-JsonLdOptions" class="idlType"><code>JsonLdOptions</code></a></span> <span class="idlParamName">options</span></span>);</span>
<span class="idlMethod">    <span class="idlMethType"><a href="#dfn-promise" class="internalDFN">Promise</a></span> <span class="idlMethName"><a href="#widl-JsonLdProcessor-flatten-Promise-any-input-JsonLdContext-context-JsonLdOptions-options">flatten</a></span> (<span class="idlParam"><span class="idlParamType"><a>any</a></span> <span class="idlParamName">input</span></span>, <span class="idlParam">optional <span class="idlParamType"><a href="#idl-def-JsonLdContext" class="idlType"><code>JsonLdContext</code></a>?</span> <span class="idlParamName">context</span></span>, <span class="idlParam">optional <span class="idlParamType"><a href="#idl-def-JsonLdOptions" class="idlType"><code>JsonLdOptions</code></a></span> <span class="idlParamName">options</span></span>);</span>
};</span></pre><section><h4 id="methods" aria-level="3" role="heading">Methods</h4><dl class="methods"><dt id="widl-JsonLdProcessor-compact-Promise-any-input-JsonLdContext-context-JsonLdOptions-options"><code>compact</code></dt><dd>
        <p><a href="#compaction">Compacts</a> the given <i>input</i> using the
          <i>context</i> according to the steps in the
          <a href="#compaction-algorithm">Compaction algorithm</a>:</p>

        <ol class="algorithm">
          <li>Create a new <a class="tref internalDFN" title="promise" href="#dfn-promise">Promise</a> <i>promise</i> and return it. The
            following steps are then executed asynchronously.</li>
          <li>If the passed <i>input</i> is a <span class="idlParamType">DOMString</span>
            representing the <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> of a remote document, dereference it.
            If the retrieved document's content type is neither <code>application/json</code>,
            nor <code>application/ld+json</code>, nor any other media type using a
            <code>+json</code> suffix as defined in [<cite><a class="bibref" href="#bib-RFC6839">RFC6839</a></cite>]
            or if the document cannot be parsed as JSON, reject the <i>promise</i> passing an
            <code class="error"><a href="#idl-def-JsonLdErrorCode.loading-document-failed">loading document failed</a></code>
            error.</li>
          <li>Initialize a new empty <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>. The <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
            of the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> is set to the <abbr title="Internationalized Resource Identifier">IRI</abbr> of the currently being processed
            document, if available; otherwise to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>. If set, the
            <code class="idlMemberName"><a href="#widl-JsonLdOptions-base">base</a></code> option
            overrides the <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</li>
          <li>If an
            <code class="idlMemberName"><a href="#widl-JsonLdOptions-expandContext">expandContext</a></code>
            has been passed, update the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> using the
            <a href="#context-processing-algorithm">Context Processing algorithm</a>, passing the
            <code class="idlMemberName"><a href="#widl-JsonLdOptions-expandContext">expandContext</a></code>
            as <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>. If
            <code class="idlMemberName"><a href="#widl-JsonLdOptions-expandContext">expandContext</a></code>
            is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> having a <code>@context</code> member, pass that member's value instead.</li>
          <li>If the <i>input</i> has been retrieved, the response has an HTTP Link Header [<cite><a class="bibref" href="#bib-RFC5988">RFC5988</a></cite>]
            using the <code>http://www.w3.org/ns/json-ld#context</code> link relation
            and a content type of <code>application/json</code> or any media type
            with a <code>+json</code> suffix as defined in [<cite><a class="bibref" href="#bib-RFC6839">RFC6839</a></cite>] except
            <code>application/ld+json</code>, update the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> using the
            <a href="#context-processing-algorithm">Context Processing algorithm</a>, passing the
            context referenced in the HTTP Link Header as <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>. The
            HTTP Link Header is ignored for documents served as <code>application/ld+json</code> If
            multiple HTTP Link Headers using the <code>http://www.w3.org/ns/json-ld#context</code>
            link relation are found, the <i>promise</i> is rejected with a <a href="#idl-def-JsonLdError" class="idlType"><code>JsonLdError</code></a> whose code is set to
            <code class="error"><a href="#idl-def-JsonLdErrorCode.multiple-context-link-headers">multiple context link headers</a></code>
            and processing is terminated.</li>
          <li>Set <i>expanded</i> to the result of using the
            <a href="#expansion-algorithm">Expansion algorithm</a>, passing the
            <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> and <i>input</i> as <i>element</i>.</li>
          <li>If <i>context</i> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> having a <code>@context</code> member, set
            <i>context</i> to that member's value.</li>
          <li>Set <i>compacted</i> to the result of using the
            <a href="#compaction-algorithm">Compaction algorithm</a>, passing
            <i>context</i>, <i>expanded</i> as <i>element</i>, and if passed, the
            <code class="idlMemberName"><a href="#widl-JsonLdOptions-compactArrays">compactArrays</a></code>
            flag in <i>options</i>.</li>
          <li>Fulfill the <i>promise</i> passing <i>compacted</i>.</li>
        </ol>


      <table class="parameters"><tr><th>Parameter</th><th>Type</th><th>Nullable</th><th>Optional</th><th>Description</th></tr><tr><td class="prmName">input</td><td class="prmType"><code><a>any</a></code></td><td class="prmNullFalse">✘</td><td class="prmOptFalse">✘</td><td class="prmDesc">The JSON-LD object or array of JSON-LD objects to perform the compaction upon or an
            <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> referencing the JSON-LD document to compact.</td></tr><tr><td class="prmName">context</td><td class="prmType"><code><a href="#idl-def-JsonLdContext" class="idlType"><code>JsonLdContext</code></a></code></td><td class="prmNullFalse">✘</td><td class="prmOptFalse">✘</td><td class="prmDesc">The context to use when compacting the <code>input</code>;
            it can be specified by using a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>, an
            <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>, or an array consisting of
            <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>s and <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>s.</td></tr><tr><td class="prmName">options</td><td class="prmType"><code><a href="#idl-def-JsonLdOptions" class="idlType"><code>JsonLdOptions</code></a></code></td><td class="prmNullFalse">✘</td><td class="prmOptTrue">✔</td><td class="prmDesc">A set of options to configure the algorithms. This allows, e.g.,
            to set the input document's base <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</td></tr></table><div><em>Return type: </em><code><a href="#dfn-promise" class="internalDFN">Promise</a></code></div></dd><dt id="widl-JsonLdProcessor-expand-Promise-any-input-JsonLdOptions-options"><code>expand</code></dt><dd>
        <p><a href="#expansion">Expands</a> the given <i>input</i> according to
          the steps in the <a href="#expansion-algorithm">Expansion algorithm</a>:</p>

        <ol class="algorithm">
          <li>Create a new <a class="tref internalDFN" title="promise" href="#dfn-promise">Promise</a> <i>promise</i> and return it. The
            following steps are then executed asynchronously.</li>
          <li>If the passed <i>input</i> is a <span class="idlParamType">DOMString</span>
            representing the <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> of a remote document, dereference it.
            If the retrieved document's content type is neither <code>application/json</code>,
            nor <code>application/ld+json</code>, nor any other media type using a
            <code>+json</code> suffix as defined in [<cite><a class="bibref" href="#bib-RFC6839">RFC6839</a></cite>], reject the <i>promise</i> passing an
            <code class="error"><a href="#idl-def-JsonLdErrorCode.loading-document-failed">loading document failed</a></code>
            error.</li>
          <li>Initialize a new empty <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>. The <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
            of the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> is set to the <abbr title="Internationalized Resource Identifier">IRI</abbr> of the currently being processed
            document, if available; otherwise to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>. If set, the
            <code class="idlMemberName"><a href="#widl-JsonLdOptions-base">base</a></code> option
            overrides the <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</li>
          <li>If an
            <code class="idlMemberName"><a href="#widl-JsonLdOptions-expandContext">expandContext</a></code>
            has been passed, update the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> using the
            <a href="#context-processing-algorithm">Context Processing algorithm</a>, passing the
            <code class="idlMemberName"><a href="#widl-JsonLdOptions-expandContext">expandContext</a></code>
            as <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>. If
            <code class="idlMemberName"><a href="#widl-JsonLdOptions-expandContext">expandContext</a></code>
            is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> having a <code>@context</code> member, pass that member's value instead.</li>
          <li>If the <i>input</i> has been retrieved, the response has an HTTP Link Header [<cite><a class="bibref" href="#bib-RFC5988">RFC5988</a></cite>]
            using the <code>http://www.w3.org/ns/json-ld#context</code> link relation
            and a content type of <code>application/json</code> or any media type
            with a <code>+json</code> suffix as defined in [<cite><a class="bibref" href="#bib-RFC6839">RFC6839</a></cite>] except
            <code>application/ld+json</code>, update the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> using the
            <a href="#context-processing-algorithm">Context Processing algorithm</a>, passing the
            context referenced in the HTTP Link Header as <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>. The
            HTTP Link Header is ignored for documents served as <code>application/ld+json</code> If
            multiple HTTP Link Headers using the <code>http://www.w3.org/ns/json-ld#context</code>
            link relation are found, the <i>promise</i> is rejected with a <a href="#idl-def-JsonLdError" class="idlType"><code>JsonLdError</code></a> whose code is set to
            <code class="error"><a href="#idl-def-JsonLdErrorCode.multiple-context-link-headers">multiple context link headers</a></code>
            and processing is terminated.</li>
          <li>Set <i>expanded</i> to the result of using the
            <a href="#expansion-algorithm">Expansion algorithm</a>, passing the
            <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> and <i>input</i> as <i>element</i>.</li>
          <li>Fulfill the <i>promise</i> passing <i>expanded</i>.</li>
        </ol>


      <table class="parameters"><tr><th>Parameter</th><th>Type</th><th>Nullable</th><th>Optional</th><th>Description</th></tr><tr><td class="prmName">input</td><td class="prmType"><code><a>any</a></code></td><td class="prmNullFalse">✘</td><td class="prmOptFalse">✘</td><td class="prmDesc">The JSON-LD object or array of JSON-LD objects to perform the expansion upon or an
            <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> referencing the JSON-LD document to expand.</td></tr><tr><td class="prmName">options</td><td class="prmType"><code><a href="#idl-def-JsonLdOptions" class="idlType"><code>JsonLdOptions</code></a></code></td><td class="prmNullFalse">✘</td><td class="prmOptTrue">✔</td><td class="prmDesc">A set of options to configure the used algorithms such. This allows, e.g.,
            to set the input document's base <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</td></tr></table><div><em>Return type: </em><code><a href="#dfn-promise" class="internalDFN">Promise</a></code></div></dd><dt id="widl-JsonLdProcessor-flatten-Promise-any-input-JsonLdContext-context-JsonLdOptions-options"><code>flatten</code></dt><dd>
        <p><a href="#flattening">Flattens</a> the given <i>input</i> and
          <a href="#compaction">compacts</a> it using the passed <i>context</i>
          according to the steps in the <a href="#flattening-algorithm">Flattening algorithm</a>:</p>

        <ol class="algorithm">
          <li>Create a new <a class="tref internalDFN" title="promise" href="#dfn-promise">Promise</a> <i>promise</i> and return it. The
            following steps are then executed asynchronously.</li>
          <li>If the passed <i>input</i> is a <span class="idlParamType">DOMString</span>
            representing the <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> of a remote document, dereference it.
            If the retrieved document's content type is neither <code>application/json</code>,
            nor <code>application/ld+json</code>, nor any other media type using a
            <code>+json</code> suffix as defined in [<cite><a class="bibref" href="#bib-RFC6839">RFC6839</a></cite>], reject the <i>promise</i> passing an
            <code class="error"><a href="#idl-def-JsonLdErrorCode.loading-document-failed">loading document failed</a></code>
            error.</li>
          <li>Initialize a new empty <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>. The <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
            of the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> is set to the <abbr title="Internationalized Resource Identifier">IRI</abbr> of the currently being processed
            document, if available; otherwise to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>. If set, the
            <code class="idlMemberName"><a href="#widl-JsonLdOptions-base">base</a></code> option
            overrides the <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</li>
          <li>If an
            <code class="idlMemberName"><a href="#widl-JsonLdOptions-expandContext">expandContext</a></code>
            has been passed, update the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> using the
            <a href="#context-processing-algorithm">Context Processing algorithm</a>, passing the
            <code class="idlMemberName"><a href="#widl-JsonLdOptions-expandContext">expandContext</a></code>
            as <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>. If
            <code class="idlMemberName"><a href="#widl-JsonLdOptions-expandContext">expandContext</a></code>
            is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> having a <code>@context</code> member, pass that member's value instead.</li>
          <li>If the <i>input</i> has been retrieved, the response has an HTTP Link Header [<cite><a class="bibref" href="#bib-RFC5988">RFC5988</a></cite>]
            using the <code>http://www.w3.org/ns/json-ld#context</code> link relation
            and a content type of <code>application/json</code> or any media type
            with a <code>+json</code> suffix as defined in [<cite><a class="bibref" href="#bib-RFC6839">RFC6839</a></cite>] except
            <code>application/ld+json</code>, update the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> using the
            <a href="#context-processing-algorithm">Context Processing algorithm</a>, passing the
            context referenced in the HTTP Link Header as <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>. The
            HTTP Link Header is ignored for documents served as <code>application/ld+json</code> If
            multiple HTTP Link Headers using the <code>http://www.w3.org/ns/json-ld#context</code>
            link relation are found, the <i>promise</i> is rejected with a <a href="#idl-def-JsonLdError" class="idlType"><code>JsonLdError</code></a> whose code is set to
            <code class="error"><a href="#idl-def-JsonLdErrorCode.multiple-context-link-headers">multiple context link headers</a></code>
            and processing is terminated.</li>
          <li>Set <i>expanded</i> to the result of using the
            <a href="#expansion-algorithm">Expansion algorithm</a>, passing the
            <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> and <i>input</i> as <i>element</i>.</li>
          <li>If <i>context</i> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> having a <code>@context</code> member, set
            <i>context</i> to that member's value.</li>
          <li>Initialize an empty <i>identifier map</i> and a <i>counter</i> (set to <code>0</code>)
            to be used by the
            <a href="#generate-blank-node-identifier">Generate Blank Node Identifier algorithm</a>.</li>
          <li>Set <i>flattened</i> to the result of using the
            <a href="#flattening-algorithm">Flattening algorithm</a>, passing
            <i>expanded</i> as <i>element</i>, <i>context</i>, and if passed, the
            <code class="idlMemberName"><a href="#widl-JsonLdOptions-compactArrays">compactArrays</a></code>
            flag in <i>options</i> (which is internally passed to the
            <a href="#compaction-algorithm">Compaction algorithm</a>).</li>
          <li>Fulfill the <i>promise</i> passing <i>flattened</i>.</li>
        </ol>


      <table class="parameters"><tr><th>Parameter</th><th>Type</th><th>Nullable</th><th>Optional</th><th>Description</th></tr><tr><td class="prmName">input</td><td class="prmType"><code><a>any</a></code></td><td class="prmNullFalse">✘</td><td class="prmOptFalse">✘</td><td class="prmDesc">The JSON-LD object or array of JSON-LD objects or an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>
            referencing the JSON-LD document to flatten.</td></tr><tr><td class="prmName">context</td><td class="prmType"><code><a href="#idl-def-JsonLdContext" class="idlType"><code>JsonLdContext</code></a></code></td><td class="prmNullTrue">✔</td><td class="prmOptTrue">✔</td><td class="prmDesc">The context to use when compacting the flattened <code>input</code>;
            it can be specified by using a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>, an
            <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>, or an array consisting of <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>s
            and <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>s. If not
            passed or <a class="tref internalDFN" title="null" href="#dfn-null">null</a> is passed, the result will not be compacted
            but kept in expanded form.</td></tr><tr><td class="prmName">options</td><td class="prmType"><code><a href="#idl-def-JsonLdOptions" class="idlType"><code>JsonLdOptions</code></a></code></td><td class="prmNullFalse">✘</td><td class="prmOptTrue">✔</td><td class="prmDesc">A set of options to configure the used algorithms such. This allows, e.g.,
            to set the input document's base <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</td></tr></table><div><em>Return type: </em><code><a href="#dfn-promise" class="internalDFN">Promise</a></code></div></dd></dl></section>

    <pre class="idl"><span class="idlTypedef" id="idl-def-JsonLdContext">typedef <span class="idlTypedefType">(<a>object</a> or <a>DOMString</a> or <a>(object</a> or <a>DOMString[])</a>)</span> <span class="idlTypedefID">JsonLdContext</span>;</span></pre><div class="idlTypedefDesc">
      <p>The <a href="#idl-def-JsonLdContext" class="idlType"><code>JsonLdContext</code></a> type is used to refer to a value that
        that may be a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>, a <a class="tref internalDFN" title="string" href="#dfn-string">string</a> representing an
        <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>, or an array of <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON objects</a>
        and <a class="tref internalDFN" title="string" href="#dfn-string">strings</a>.</p>
    </div>
  </section> <!-- end of JsonLdProcessor -->

  <section id="the-jsonldoptions-type">
    <h3 aria-level="2" role="heading" id="h3_the-jsonldoptions-type"><span class="secno">11.2 </span>The <a href="#idl-def-JsonLdOptions" class="idlType"><code>JsonLdOptions</code></a> Type</h3>

    <p>The <a href="#idl-def-JsonLdOptions" class="idlType"><code>JsonLdOptions</code></a> type is used to pass various options to the
      <a href="#idl-def-JsonLdProcessor" class="idlType"><code>JsonLdProcessor</code></a> methods.</p>

    <pre class="idl"><span class="idlDictionary" id="idl-def-JsonLdOptions">dictionary <span class="idlDictionaryID">JsonLdOptions</span> {
<span class="idlMember">    <span class="idlMemberType"><a>DOMString</a>?</span>             <span class="idlMemberName"><a href="#widl-JsonLdOptions-base">base</a></span>;</span>
<span class="idlMember">    <span class="idlMemberType"><a>boolean</a></span>                <span class="idlMemberName"><a href="#widl-JsonLdOptions-compactArrays">compactArrays</a></span> = <span class="idlMemberValue">true</span>;</span>
<span class="idlMember">    <span class="idlMemberType"><a href="#idl-def-LoadDocumentCallback" class="idlType"><code>LoadDocumentCallback</code></a></span>   <span class="idlMemberName"><a href="#widl-JsonLdOptions-documentLoader">documentLoader</a></span> = <span class="idlMemberValue">null</span>;</span>
<span class="idlMember">    <span class="idlMemberType">(<a>object?</a> or <a>DOMString</a>)</span> <span class="idlMemberName"><a href="#widl-JsonLdOptions-expandContext">expandContext</a></span> = <span class="idlMemberValue">null</span>;</span>
<span class="idlMember">    <span class="idlMemberType"><a>DOMString</a></span>              <span class="idlMemberName"><a href="#widl-JsonLdOptions-processingMode">processingMode</a></span> = <span class="idlMemberValue">"json-ld-1.0"</span>;</span>
};</span></pre><section><h4 id="dictionary-jsonldoptions-members" aria-level="3" role="heading">Dictionary <a class="idlType" href="#idl-def-JsonLdOptions"><code>JsonLdOptions</code></a> Members</h4><dl class="dictionary-members"><dt id="widl-JsonLdOptions-base"><code>base</code> of type <span class="idlMemberType"><a>DOMString</a></span>, nullable</dt><dd>The base <abbr title="Internationalized Resource Identifier">IRI</abbr> to use when expanding or compacting the document. If set, this overrides
        the input document's <abbr title="Internationalized Resource Identifier">IRI</abbr>.</dd><dt id="widl-JsonLdOptions-compactArrays"><code>compactArrays</code> of type <span class="idlMemberType"><a>boolean</a></span>, defaulting to <code>true</code></dt><dd>If set to <code>true</code>, the JSON-LD processor replaces arrays with just
        one element with that element during compaction. If set to <code>false</code>,
        all arrays will remain arrays even if they have just one element.
      </dd><dt id="widl-JsonLdOptions-documentLoader"><code>documentLoader</code> of type <span class="idlMemberType"><a href="#idl-def-LoadDocumentCallback" class="idlType"><code>LoadDocumentCallback</code></a></span>, defaulting to <code>null</code></dt><dd>The callback of the loader to be used to retrieve remote documents and contexts.
        If specified, it <em class="rfc2119" title="MUST">MUST</em> be used to retrieve remote documents and contexts; otherwise,
        if not specified, the processor's built-in loader <em class="rfc2119" title="MUST">MUST</em> be used.</dd><dt id="widl-JsonLdOptions-expandContext"><code>expandContext</code> of type <span class="idlMemberType"><a>(object? or DOMString)</a></span>, defaulting to <code>null</code></dt><dd>A context that is used to initialize the active context when expanding a document.</dd><dt id="widl-JsonLdOptions-processingMode"><code>processingMode</code> of type <span class="idlMemberType"><a>DOMString</a></span>, defaulting to <code>"json-ld-1.0"</code></dt><dd>If set to <code>json-ld-1.0</code>, the JSON-LD processor <em class="rfc2119" title="MUST">MUST</em> produce
        exactly the same results as the algorithms defined in this specification.
        If set to another value, the JSON-LD processor is allowed to extend
        or modify the algorithms defined in this specification to enable
        application-specific optimizations. The definition of such
        optimizations is beyond the scope of this specification and thus
        not defined. Consequently, different implementations <em class="rfc2119" title="MAY">MAY</em> implement
        different optimizations. Developers <em class="rfc2119" title="MUST NOT">MUST NOT</em> define modes beginning
        with <code>json-ld</code> as they are reserved for future versions
        of this specification.</dd></dl></section>
  </section> <!-- end JsonLdOptions -->

  <section id="remote-document-and-context-retrieval">
    <h3 aria-level="2" role="heading" id="h3_remote-document-and-context-retrieval"><span class="secno">11.3 </span>Remote Document and Context Retrieval</h3>

    <p>Developers can utilize a callback to control how remote documents and contexts are retrieved
      by <a class="tref internalDFN" title="json-ld-api-implementation" href="#dfn-json-ld-api-implementation">JSON-LD API Implementations</a>.
      This section details the parameters of that callback and the data structure
      used to return the retrieved context.</p>

    <section>
      <h4 id="loaddocumentcallback" aria-level="3" role="heading">LoadDocumentCallback</h4>

      <p>The <a href="#idl-def-LoadDocumentCallback" class="idlType"><code>LoadDocumentCallback</code></a> defines a callback that custom document loaders
        have to implement to be used to retrieve remote documents and contexts.</p>

      <pre class="idl"><span class="idlCallback" id="idl-def-LoadDocumentCallback">callback <span class="idlCallbackID">LoadDocumentCallback</span> = <span class="idlCallbackType"><a href="#dfn-promise" class="internalDFN">Promise</a></span> (<span class="idlParam"><span class="idlParamType"><a>DOMString</a></span> <span class="idlParamName">url</span></span>);</span></pre><section><h5 id="callback-loaddocumentcallback-parameters" aria-level="4" role="heading">Callback <a class="idlType" href="#idl-def-LoadDocumentCallback"><code>LoadDocumentCallback</code></a> Parameters</h5><dl class="callback-members"><dt id="widl-LoadDocumentCallback-url"><code>url</code> of type <span class="idlMemberType"><a>DOMString</a></span></dt><dd>The URL of the remote document or context to load.</dd></dl></section>

      <p>All errors <em class="rfc2119" title="MUST">MUST</em> result in the <a class="tref internalDFN" title="promise" href="#dfn-promise">Promise</a> being rejected with
        a <a href="#idl-def-JsonLdError" class="idlType"><code>JsonLdError</code></a> whose code is set to
        <code class="error"><a href="#idl-def-JsonLdErrorCode.loading-document-failed">loading document failed</a></code>
        or <code class="error"><a href="#idl-def-JsonLdErrorCode.multiple-context-link-headers">multiple context link headers</a></code>
        as described in the next section.</p>
    </section>

    <section>
      <h4 id="remotedocument" aria-level="3" role="heading">RemoteDocument</h4>

      <p>The <a href="#idl-def-RemoteDocument" class="idlType"><code>RemoteDocument</code></a> type is used by a <a href="#idl-def-LoadDocumentCallback" class="idlType"><code>LoadDocumentCallback</code></a>
        to return information about a remote document or context.</p>

      <pre class="idl"><span class="idlDictionary" id="idl-def-RemoteDocument">dictionary <span class="idlDictionaryID">RemoteDocument</span> {
<span class="idlMember">    <span class="idlMemberType"><a>DOMString</a></span> <span class="idlMemberName"><a href="#widl-RemoteDocument-contextUrl">contextUrl</a></span> = <span class="idlMemberValue">null</span>;</span>
<span class="idlMember">    <span class="idlMemberType"><a>DOMString</a></span> <span class="idlMemberName"><a href="#widl-RemoteDocument-documentUrl">documentUrl</a></span>;</span>
<span class="idlMember">    <span class="idlMemberType"><a>any</a></span>       <span class="idlMemberName"><a href="#widl-RemoteDocument-document">document</a></span>;</span>
};</span></pre><section><h5 id="dictionary-remotedocument-members" aria-level="4" role="heading">Dictionary <a class="idlType" href="#idl-def-RemoteDocument"><code>RemoteDocument</code></a> Members</h5><dl class="dictionary-members"><dt id="widl-RemoteDocument-contextUrl"><code>contextUrl</code> of type <span class="idlMemberType"><a>DOMString</a></span>, defaulting to <code>null</code></dt><dd>If available, the value of the HTTP Link Header [<cite><a class="bibref" href="#bib-RFC5988">RFC5988</a></cite>] using the
          <code>http://www.w3.org/ns/json-ld#context</code> link relation in the
          response. If the response's content type is <code>application/ld+json</code>,
          the HTTP Link Header <em class="rfc2119" title="MUST">MUST</em> be ignored. If multiple HTTP Link Headers using
          the <code>http://www.w3.org/ns/json-ld#context</code> link relation are found,
          the <a class="tref internalDFN" title="promise" href="#dfn-promise">Promise</a> of the <a href="#idl-def-LoadDocumentCallback" class="idlType"><code>LoadDocumentCallback</code></a> <em class="rfc2119" title="MUST">MUST</em> be rejected with
          a <a href="#idl-def-JsonLdError" class="idlType"><code>JsonLdError</code></a> whose code is set to
          <code class="error"><a href="#idl-def-JsonLdErrorCode.multiple-context-link-headers">multiple context link headers</a></code>.</dd><dt id="widl-RemoteDocument-document"><code>document</code> of type <span class="idlMemberType"><a>any</a></span></dt><dd>The retrieved document. This can either be the raw payload or the already
          parsed document.</dd><dt id="widl-RemoteDocument-documentUrl"><code>documentUrl</code> of type <span class="idlMemberType"><a>DOMString</a></span></dt><dd>The final URL of the loaded document. This is important
          to handle HTTP redirects properly.</dd></dl></section>
    </section>
  </section> <!-- end of Remote Document and Context Retrieval -->

  <section id="error-handling">
    <h3 aria-level="2" role="heading" id="h3_error-handling"><span class="secno">11.4 </span>Error Handling</h3>

    <p>This section describes the datatype definitions used within the
      JSON-LD API for error handling.</p>

    <section>
      <h4 id="jsonlderror" aria-level="3" role="heading">JsonLdError</h4>

      <p>The <a href="#idl-def-JsonLdError" class="idlType"><code>JsonLdError</code></a> type is used to report processing errors.</p>

      <pre class="idl"><span class="idlDictionary" id="idl-def-JsonLdError">dictionary <span class="idlDictionaryID">JsonLdError</span> {
<span class="idlMember">    <span class="idlMemberType"><a href="#idl-def-JsonLdErrorCode" class="idlType"><code>JsonLdErrorCode</code></a></span> <span class="idlMemberName"><a href="#widl-JsonLdError-code">code</a></span>;</span>
<span class="idlMember">    <span class="idlMemberType"><a>DOMString</a>?</span>      <span class="idlMemberName"><a href="#widl-JsonLdError-message">message</a></span> = <span class="idlMemberValue">null</span>;</span>
};</span></pre><section><h5 id="dictionary-jsonlderror-members" aria-level="4" role="heading">Dictionary <a class="idlType" href="#idl-def-JsonLdError"><code>JsonLdError</code></a> Members</h5><dl class="dictionary-members"><dt id="widl-JsonLdError-code"><code>code</code> of type <span class="idlMemberType"><a href="#idl-def-JsonLdErrorCode" class="idlType"><code>JsonLdErrorCode</code></a></span></dt><dd>a string representing the particular error type, as described in
          the various algorithms in this document.</dd><dt id="widl-JsonLdError-message"><code>message</code> of type <span class="idlMemberType"><a>DOMString</a></span>, nullable, defaulting to <code>null</code></dt><dd>an optional error message containing additional debugging information.
          The specific contents of error messages are outside the scope of this
          specification.</dd></dl></section>
    </section>

    <section>
      <h4 id="jsonlderrorcode" aria-level="3" role="heading">JsonLdErrorCode</h4>
      <p>The <a href="#idl-def-JsonLdErrorCode" class="idlType"><code>JsonLdErrorCode</code></a> represents the collection of valid JSON-LD error
        codes.</p>

      <div class="issue atrisk"><div class="issue-title" aria-level="4" role="heading" id="h_issue_4"><a href="https://www.w3.org/2011/rdf-wg/wiki/JSON-LD_Features_at_Risk#4"><span>Feature at Risk 4</span></a>: Lists of lists and partial list conversion from RDF</div><div class="atrisk" id="at-risk-4">
        <p class="atrisk-head">Note: This feature is
          <a href="http://www.w3.org/2005/10/Process-20051014/tr#cfi">"at risk"</a> and may
          be removed from this specification based on feedback. Please send feedback to
          <a href="mailto:public-rdf-comments@w3.org">public-rdf-comments@w3.org</a>.
          For the current status see
          <a href="http://www.w3.org/2011/rdf-wg/wiki/JSON-LD_Features_at_Risk">features "at risk" in JSON-LD 1.0</a></p>
       <p>The JSON-LD algorithms have been updated to support conversion of lists
          of lists to <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list objects</a> by preserving
          the blank node head of the inner list. Lists of lists can, however, not be
          represented directly in JSON-LD using the <code>@list</code> construct;
          they have to be represented as a set of interlinked node objects using
          RDF's rdf:first and rdf:rest properties. Implementors are asked to pay
          particular attention to the feature and provide feedback on lists of lists
          and partial lists. The feature may remain in the specification, or it may
          be removed after further implementation experience has been gathered.
          Similarly, partial list conversion in the RDF algorithms have been marked
          as a feature at risk and may be removed from the specification based
          on implementation feedback.</p>
      </div></div>

      <pre class="idl"><span class="idlEnum" id="idl-def-JsonLdErrorCode">enum <span class="idlEnumID">JsonLdErrorCode</span> {
    "<a href="#idl-def-JsonLdErrorCode.loading-document-failed" class="idlEnumItem">loading document failed</a>",
    "<a href="#idl-def-JsonLdErrorCode.list-of-lists" class="idlEnumItem">list of lists</a>",
    "<a href="#idl-def-JsonLdErrorCode.invalid--index-value" class="idlEnumItem">invalid @index value</a>",
    "<a href="#idl-def-JsonLdErrorCode.conflicting-indexes" class="idlEnumItem">conflicting indexes</a>",
    "<a href="#idl-def-JsonLdErrorCode.invalid--id-value" class="idlEnumItem">invalid @id value</a>",
    "<a href="#idl-def-JsonLdErrorCode.invalid-local-context" class="idlEnumItem">invalid local context</a>",
    "<a href="#idl-def-JsonLdErrorCode.multiple-context-link-headers" class="idlEnumItem">multiple context link headers</a>",
    "<a href="#idl-def-JsonLdErrorCode.loading-remote-context-failed" class="idlEnumItem">loading remote context failed</a>",
    "<a href="#idl-def-JsonLdErrorCode.invalid-remote-context" class="idlEnumItem">invalid remote context</a>",
    "<a href="#idl-def-JsonLdErrorCode.recursive-context-inclusion" class="idlEnumItem">recursive context inclusion</a>",
    "<a href="#idl-def-JsonLdErrorCode.invalid-base-IRI" class="idlEnumItem">invalid base IRI</a>",
    "<a href="#idl-def-JsonLdErrorCode.invalid-vocab-mapping" class="idlEnumItem">invalid vocab mapping</a>",
    "<a href="#idl-def-JsonLdErrorCode.invalid-default-language" class="idlEnumItem">invalid default language</a>",
    "<a href="#idl-def-JsonLdErrorCode.keyword-redefinition" class="idlEnumItem">keyword redefinition</a>",
    "<a href="#idl-def-JsonLdErrorCode.invalid-term-definition" class="idlEnumItem">invalid term definition</a>",
    "<a href="#idl-def-JsonLdErrorCode.invalid-reverse-property" class="idlEnumItem">invalid reverse property</a>",
    "<a href="#idl-def-JsonLdErrorCode.invalid-IRI-mapping" class="idlEnumItem">invalid IRI mapping</a>",
    "<a href="#idl-def-JsonLdErrorCode.cyclic-IRI-mapping" class="idlEnumItem">cyclic IRI mapping</a>",
    "<a href="#idl-def-JsonLdErrorCode.invalid-keyword-alias" class="idlEnumItem">invalid keyword alias</a>",
    "<a href="#idl-def-JsonLdErrorCode.invalid-type-mapping" class="idlEnumItem">invalid type mapping</a>",
    "<a href="#idl-def-JsonLdErrorCode.invalid-language-mapping" class="idlEnumItem">invalid language mapping</a>",
    "<a href="#idl-def-JsonLdErrorCode.colliding-keywords" class="idlEnumItem">colliding keywords</a>",
    "<a href="#idl-def-JsonLdErrorCode.invalid-container-mapping" class="idlEnumItem">invalid container mapping</a>",
    "<a href="#idl-def-JsonLdErrorCode.invalid-type-value" class="idlEnumItem">invalid type value</a>",
    "<a href="#idl-def-JsonLdErrorCode.invalid-value-object" class="idlEnumItem">invalid value object</a>",
    "<a href="#idl-def-JsonLdErrorCode.invalid-value-object-value" class="idlEnumItem">invalid value object value</a>",
    "<a href="#idl-def-JsonLdErrorCode.invalid-language-tagged-string" class="idlEnumItem">invalid language-tagged string</a>",
    "<a href="#idl-def-JsonLdErrorCode.invalid-language-tagged-value" class="idlEnumItem">invalid language-tagged value</a>",
    "<a href="#idl-def-JsonLdErrorCode.invalid-typed-value" class="idlEnumItem">invalid typed value</a>",
    "<a href="#idl-def-JsonLdErrorCode.invalid-set-or-list-object" class="idlEnumItem">invalid set or list object</a>",
    "<a href="#idl-def-JsonLdErrorCode.invalid-language-map-value" class="idlEnumItem">invalid language map value</a>",
    "<a href="#idl-def-JsonLdErrorCode.compaction-to-list-of-lists" class="idlEnumItem">compaction to list of lists</a>",
    "<a href="#idl-def-JsonLdErrorCode.invalid-reverse-property-map" class="idlEnumItem">invalid reverse property map</a>",
    "<a href="#idl-def-JsonLdErrorCode.invalid--reverse-value" class="idlEnumItem">invalid @reverse value</a>",
    "<a href="#idl-def-JsonLdErrorCode.invalid-reverse-property-value" class="idlEnumItem">invalid reverse property value</a>"
};</span></pre><table class="simple"><tr><th colspan="2">Enumeration description</th></tr><tr><td><code id="idl-def-JsonLdErrorCode.loading-document-failed">loading document failed</code></td><td>The document could not be loaded or parsed as JSON.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.list-of-lists">list of lists</code></td><td>A list of lists was detected. List of lists are not supported in
          this version of JSON-LD due to the algorithmic complexity.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid--index-value">invalid @index value</code></td><td>An <code>@index</code> member was encountered whose value was
          not a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.conflicting-indexes">conflicting indexes</code></td><td>Multiple conflicting indexes have been found for the same node.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid--id-value">invalid @id value</code></td><td>An <code>@id</code> member was encountered whose value was not a
          <a class="tref internalDFN" title="string" href="#dfn-string">string</a>.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-local-context">invalid local context</code></td><td>In invalid <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> was detected.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.multiple-context-link-headers">multiple context link headers</code></td><td>Multiple HTTP Link Headers [<cite><a class="bibref" href="#bib-RFC5988">RFC5988</a></cite>] using the
          <code>http://www.w3.org/ns/json-ld#context</code> link relation
          have been detected.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.loading-remote-context-failed">loading remote context failed</code></td><td>There was a problem encountered loading a remote context.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-remote-context">invalid remote context</code></td><td>No valid context document has been found for a referenced,
         remote context.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.recursive-context-inclusion">recursive context inclusion</code></td><td>A cycle in remote context inclusions has been detected.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-base-IRI">invalid base IRI</code></td><td>An invalid <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a> has been detected, i.e., it is
          neither an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a> nor <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-vocab-mapping">invalid vocab mapping</code></td><td>An invalid <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a> has been detected, i.e.,
          it is neither an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a> nor <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-default-language">invalid default language</code></td><td>The value of the <a class="tref internalDFN" title="default-language" href="#dfn-default-language">default language</a> is not a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>
          or <a class="tref internalDFN" title="null" href="#dfn-null">null</a> and thus invalid.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.keyword-redefinition">keyword redefinition</code></td><td>A <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a> redefinition has been detected.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-term-definition">invalid term definition</code></td><td>An invalid <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> has been detected.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-reverse-property">invalid reverse property</code></td><td>An invalid reverse property definition has been detected.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-IRI-mapping">invalid IRI mapping</code></td><td>A <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> contains a <a class="tref internalDFN" title="term" href="#dfn-term">term</a> that has
          an invalid or missing <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a>.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.cyclic-IRI-mapping">cyclic IRI mapping</code></td><td>A cycle in <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mappings</a> has been detected.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-keyword-alias">invalid keyword alias</code></td><td>An invalid <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a> alias definition has been
          encountered.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-type-mapping">invalid type mapping</code></td><td>An <code>@type</code> member in a <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>
          was encountered whose value could not be expanded to an
          <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-language-mapping">invalid language mapping</code></td><td>An <code>@language</code> member in a <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>
          was encountered whose value was neither a <a class="tref internalDFN" title="string" href="#dfn-string">string</a> nor
          <a class="tref internalDFN" title="null" href="#dfn-null">null</a> and thus invalid.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.colliding-keywords">colliding keywords</code></td><td>Two properties which expand to the same keyword have been detected.
          This might occur if a <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a> and an alias thereof
          are used at the same time.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-container-mapping">invalid container mapping</code></td><td>An <code>@container</code> member was encountered whose value was
          not one of the following <a class="tref internalDFN" title="string" href="#dfn-string">strings</a>:
          <code>@list</code>, <code>@set</code>, or <code>@index</code>.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-type-value">invalid type value</code></td><td>An invalid value for an <code>@type</code> member has been detected,
          i.e., the value was neither a <a class="tref internalDFN" title="string" href="#dfn-string">string</a> nor an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>
          of <a class="tref internalDFN" title="string" href="#dfn-string">strings</a>.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-value-object">invalid value object</code></td><td>A <a class="tref internalDFN" title="value-object" href="#dfn-value-object">value object</a> with disallowed members has been
          detected.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-value-object-value">invalid value object value</code></td><td>An invalid value for the <code>@value</code> member of a
          <a class="tref internalDFN" title="value-object" href="#dfn-value-object">value object</a> has been detected, i.e., it is neither
          a <a class="tref internalDFN" title="scalar" href="#dfn-scalar">scalar</a> nor <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-language-tagged-string">invalid language-tagged string</code></td><td>A <a class="tref internalDFN" title="language-tagged-string" href="http://www.w3.org/TR/rdf11-concepts/#dfn-language-tagged-string">language-tagged string</a> with an invalid language
          value was detected.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-language-tagged-value">invalid language-tagged value</code></td><td>A <a class="tref internalDFN" title="number" href="#dfn-number">number</a>, <a class="tref internalDFN" title="true" href="#dfn-true">true</a>, or <a class="tref internalDFN" title="false" href="#dfn-false">false</a> with an
          associated language tag was detected.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-typed-value">invalid typed value</code></td><td>A <a class="tref internalDFN" title="typed-value" href="#dfn-typed-value">typed value</a> with an invalid type was detected.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-set-or-list-object">invalid set or list object</code></td><td>A <a class="tref internalDFN" title="set-object" href="#dfn-set-object">set object</a> or <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a> with
          disallowed members has been detected.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-language-map-value">invalid language map value</code></td><td>An invalid value in a <a class="tref externalDFN" title="language-map" href="http://www.w3.org/TR/2013/CR-json-ld-20130910/#dfn-language-map">language map</a>
          has been detected. It has to be a <a class="tref internalDFN" title="string" href="#dfn-string">string</a> or an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> of
          <a class="tref internalDFN" title="string" href="#dfn-string">strings</a>.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.compaction-to-list-of-lists">compaction to list of lists</code></td><td>The compacted document contains a list of lists as multiple
          lists have been compacted to the same term.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-reverse-property-map">invalid reverse property map</code></td><td>An invalid reverse property map has been detected. No
          <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keywords</a> apart from <code>@context</code>
          are allowed in reverse property maps.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid--reverse-value">invalid @reverse value</code></td><td>An invalid value for an <code>@reverse</code> member has been detected,
          i.e., the value was not a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-reverse-property-value">invalid reverse property value</code></td><td>An invalid value for a reverse property has been detected. The value of an inverse
          property must be a <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a>.</td></tr></table>
    </section>
  </section> <!-- end of Error Handling -->
</section> <!-- end of The Application Programming Interfaces -->

<section class="appendix informative" id="acknowledgements">
  <!--OddPage--><h2 aria-level="1" role="heading" id="h2_acknowledgements"><span class="secno">A. </span>Acknowledgements</h2><p><em>This section is non-normative.</em></p>

  <p>A large amount of thanks goes out to the JSON-LD Community Group
    participants who worked through many of the technical issues on the mailing
    list and the weekly telecons - of special mention are Niklas Lindström,
    François Daoust, Lin Clark, and Zdenko 'Denny' Vrandečić.
    The editors would like to thank Mark Birbeck, who provided a great deal of
    the initial push behind the JSON-LD work via his work on RDFj.
    The work of Dave Lehn and Mike Johnson are appreciated for reviewing,
    and performing several implementations of the specification. Ian Davis is
    thanked for his work on RDF/JSON. Thanks also to Nathan Rixham,
    Bradley P. Allen, Kingsley Idehen, Glenn McDonald, Alexandre Passant,
    Danny Ayers, Ted Thibodeau Jr., Olivier Grisel, Josh Mandel, Eric Prud'hommeaux,
    David Wood, Guus Schreiber, Pat Hayes, Sandro Hawke, and Richard Cyganiak
    for their input on the specification.</p>
</section>



<section id="references" class="appendix" typeof="bibo:Chapter" resource="#references" rel="bibo:chapter"><!--OddPage--><h2 aria-level="1" role="heading" id="h2_references"><span class="secno">B. </span>References</h2><section id="normative-references" typeof="bibo:Chapter" resource="#normative-references" rel="bibo:chapter"><h3 aria-level="2" role="heading" id="h3_normative-references"><span class="secno">B.1 </span>Normative references</h3><dl class="bibliography" about=""><dt id="bib-DOM-WHATWG">[DOM-WHATWG]</dt><dd rel="dcterms:requires">Anne van Kesteren, Aryeh Gregor, Ms2ger, Editors. <cite><a href="http://dom.spec.whatwg.org/">DOM</a>.</cite> September 2013. WHATWG Living Standard (work in progress). URL: <a href="http://dom.spec.whatwg.org/">http://dom.spec.whatwg.org/</a>
</dd><dt id="bib-IEEE-754-1985">[IEEE-754-1985]</dt><dd rel="dcterms:requires">IEEE. <cite>IEEE Standard for Binary Floating-Point Arithmetic.</cite> URL: <a href="http://standards.ieee.org/reading/ieee/std_public/description/busarch/754-1985_desc.html">http://standards.ieee.org/reading/ieee/std_public/description/busarch/754-1985_desc.html</a>
</dd><dt id="bib-JSON-LD">[JSON-LD]</dt><dd rel="dcterms:requires">Manu Sporny, Gregg Kellogg, Markus Lanthaler, Editors. <cite><a href="http://www.w3.org/TR/2013/CR-json-ld-20130910/">JSON-LD 1.0</a>.</cite> W3C Candidate Recommendation (work in progress). URL: <a href="http://www.w3.org/TR/2013/CR-json-ld-20130910/">http://www.w3.org/TR/2013/CR-json-ld-20130910/</a>. The latest edition is available at <a href="http://www.w3.org/TR/json-ld/">http://www.w3.org/TR/json-ld/</a>
</dd><dt id="bib-RDF-MT">[RDF-MT]</dt><dd rel="dcterms:requires">Patrick Hayes. <a href="http://www.w3.org/TR/rdf-mt/"><cite>RDF Semantics</cite></a>. 10 February 2004. W3C Recommendation. URL: <a href="http://www.w3.org/TR/rdf-mt/">http://www.w3.org/TR/rdf-mt/</a>
</dd><dt id="bib-RFC2119">[RFC2119]</dt><dd rel="dcterms:requires">S. Bradner. <a href="http://www.ietf.org/rfc/rfc2119.txt"><cite>Key words for use in RFCs to Indicate Requirement Levels.</cite></a> March 1997. Internet RFC 2119.  URL: <a href="http://www.ietf.org/rfc/rfc2119.txt">http://www.ietf.org/rfc/rfc2119.txt</a>
</dd><dt id="bib-RFC3986">[RFC3986]</dt><dd rel="dcterms:requires">T. Berners-Lee; R. Fielding; L. Masinter. <a href="http://www.ietf.org/rfc/rfc3986.txt"><cite>Uniform Resource Identifier (URI): Generic Syntax (RFC 3986)</cite></a>. January 2005. RFC. URL: <a href="http://www.ietf.org/rfc/rfc3986.txt">http://www.ietf.org/rfc/rfc3986.txt</a>
</dd><dt id="bib-RFC3987">[RFC3987]</dt><dd rel="dcterms:requires">M. Dürst; M. Suignard. <a href="http://www.ietf.org/rfc/rfc3987.txt"><cite>Internationalized Resource Identifiers (IRIs)</cite></a>. January 2005. RFC. URL: <a href="http://www.ietf.org/rfc/rfc3987.txt">http://www.ietf.org/rfc/rfc3987.txt</a>
</dd><dt id="bib-RFC4627">[RFC4627]</dt><dd rel="dcterms:requires">D. Crockford. <a href="http://www.ietf.org/rfc/rfc4627.txt"><cite>The application/json Media Type for JavaScript Object Notation (JSON) (RFC 4627)</cite></a>. July 2006. RFC. URL: <a href="http://www.ietf.org/rfc/rfc4627.txt">http://www.ietf.org/rfc/rfc4627.txt</a>
</dd><dt id="bib-RFC5988">[RFC5988]</dt><dd rel="dcterms:requires">M. Nottingham. <cite><a href="http://www.ietf.org/rfc/rfc5988.txt">Web Linking</a>.</cite> October 2010. Internet RFC 5988. URL: <a href="http://www.ietf.org/rfc/rfc5988.txt">http://www.ietf.org/rfc/rfc5988.txt</a>
</dd><dt id="bib-WEBIDL">[WEBIDL]</dt><dd rel="dcterms:requires">Cameron McCormack, Editor. <cite><a href="http://www.w3.org/TR/2012/CR-WebIDL-20120419/">Web IDL.</a></cite> 19 April 2012. W3C Candidate Recommendation (work in progress). URL: <a href="http://www.w3.org/TR/2012/CR-WebIDL-20120419/">http://www.w3.org/TR/2012/CR-WebIDL-20120419/</a>. The latest edition is available at <a href="http://www.w3.org/TR/WebIDL/">http://www.w3.org/TR/WebIDL/</a>
</dd><dt id="bib-XMLSCHEMA11-2">[XMLSCHEMA11-2]</dt><dd rel="dcterms:requires">David Peterson; Sandy Gao; Ashok Malhotra; Michael Sperberg-McQueen; Henry Thompson; Paul V. Biron et al. <a href="http://www.w3.org/TR/xmlschema11-2/"><cite>W3C XML Schema Definition Language (XSD) 1.1 Part 2: Datatypes</cite></a>. 5 April 2012. W3C Recommendation. URL: <a href="http://www.w3.org/TR/xmlschema11-2/">http://www.w3.org/TR/xmlschema11-2/</a>
</dd></dl></section><section id="informative-references" typeof="bibo:Chapter" resource="#informative-references" rel="bibo:chapter"><h3 aria-level="2" role="heading" id="h3_informative-references"><span class="secno">B.2 </span>Informative references</h3><dl class="bibliography" about=""><dt id="bib-BCP47">[BCP47]</dt><dd rel="dcterms:references">A. Phillips; M. Davis. <a href="http://tools.ietf.org/html/bcp47"><cite>Tags for Identifying Languages</cite></a>. September 2009. IETF Best Current Practice. URL: <a href="http://tools.ietf.org/html/bcp47">http://tools.ietf.org/html/bcp47</a>
</dd><dt id="bib-ECMA-262">[ECMA-262]</dt><dd rel="dcterms:references"><a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm"><cite>ECMAScript Language Specification, Edition 5.1</cite></a>. June 2011. URL: <a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm">http://www.ecma-international.org/publications/standards/Ecma-262.htm</a>
</dd><dt id="bib-JSON-LD-TESTS">[JSON-LD-TESTS]</dt><dd rel="dcterms:references"><cite><a href="http://www.w3.org/2013/json-ld-tests/">JSON-LD 1.0 Test Suite</a></cite>. W3C Test Suite (work in progress). URL: <a href="http://www.w3.org/2013/json-ld-tests/">http://www.w3.org/2013/json-ld-tests/</a>
</dd><dt id="bib-RDF11-CONCEPTS">[RDF11-CONCEPTS]</dt><dd rel="dcterms:references">Richard Cyganiak, David Wood, Editors. <cite><a href="http://www.w3.org/TR/2013/WD-rdf11-concepts-20130723/">RDF 1.1 Concepts and Abstract Syntax.</a></cite> 23 July 2013. W3C Last Call Working Draft (work in progress). URL: <a href="http://www.w3.org/TR/2013/WD-rdf11-concepts-20130723/">http://www.w3.org/TR/2013/WD-rdf11-concepts-20130723/</a>. The latest edition is available at <a href="http://www.w3.org/TR/rdf11-concepts/">http://www.w3.org/TR/rdf11-concepts/</a>
</dd><dt id="bib-RFC6839">[RFC6839]</dt><dd rel="dcterms:references">Tony Hansen, Alexey Melnikov. <cite><a href="http://www.ietf.org/rfc/rfc6839.txt">Additional Media Type Structured Syntax Suffixes</a>.</cite> January 2013. Internet RFC 6839. URL: <a href="http://www.ietf.org/rfc/rfc6839.txt">http://www.ietf.org/rfc/rfc6839.txt</a>
</dd><dt id="bib-TURTLE">[TURTLE]</dt><dd rel="dcterms:references">Eric Prud'hommeaux, Gavin Carothers, Editors. <cite><a href="http://www.w3.org/TR/2013/CR-turtle-20130219/">Turtle: Terse RDF Triple Language.</a></cite> 19 February 2013. W3C Candidate Recommendation (work in progress). URL: <a href="http://www.w3.org/TR/2013/CR-turtle-20130219/">http://www.w3.org/TR/2013/CR-turtle-20130219/</a>. The latest edition is available at <a href="http://www.w3.org/TR/turtle/">http://www.w3.org/TR/turtle/</a>
</dd></dl></section></section></body></html>
